将 Typora 小工具添加到右键菜单中

将 Typora 小工具添加到右键菜单中

1、参考资料

  1. Windows下在所有的文件添加右键菜单功能
  2. 程序添加右键菜单运行并传右键文件全名
  3. bat 传递参数
  4. 批处理判断是文件还是文件夹的几种方法
  5. %~dp0是什么意思
  6. Java丨Cmd运行Jar出现乱码问题
  7. Java操作系统剪贴板(Clipboard)实现复制和粘贴

2、前言

之前写了一款 Typora 小工具,使用起来吧不是很方便,每次都要进入 IDEA 中修改笔记存储路径,然后点击【Run】运行该程序

image-20210204215214347

之前我写过一篇博客 将Sublime Text添加到右键菜单中,于是我就突发奇想:

  1. 将 Java 程序打包为可执行 jar 包
  2. 编写 typora-tools.bat 批处理程序来启动此 jar 包,并传入笔记的存储路径
  3. 将 typora-tools.bat 批处理程序添加到右键菜单栏中

卧槽,美滋滋啊!

3、解决思路

如何将自定义程序添加到右键菜单栏中?

说干就来干,之前 将Sublime Text添加到右键菜单中 时,接触过如下批处理程序,我们依葫芦画瓢即可

@ECHO OFF & PUSHD %~DP0 & TITLE
>NUL 2>&1 REG.exe query "HKU\S-1-5-19" || (
    ECHO SET UAC = CreateObject^("Shell.Application"^) > "%TEMP%\Getadmin.vbs"
    ECHO UAC.ShellExecute "%~f0", "%1", "", "runas", 1 >> "%TEMP%\Getadmin.vbs"
    "%TEMP%\Getadmin.vbs"
    DEL /f /q "%TEMP%\Getadmin.vbs" 2>NUL
    Exit /b
)
SET /P ST=输入a添加右键菜单,输入d删除右键菜单:
if /I "%ST%"=="a" goto Add
if /I "%ST%"=="d" goto Remove
:Add
reg add "HKEY_CLASSES_ROOT\*\shell\Sublime Text"         /t REG_SZ /v "" /d "用 &Sublime Text 打开"   /f
reg add "HKEY_CLASSES_ROOT\*\shell\Sublime Text"         /t REG_EXPAND_SZ /v "Icon" /d "%~dp0sublime_text.exe" /f
reg add "HKEY_CLASSES_ROOT\*\shell\Sublime Text\command" /t REG_SZ /v "" /d "%~dp0sublime_text.exe \"%%1\"" /f
 
exit
:Remove
reg delete "HKEY_CLASSES_ROOT\*\shell\Sublime Text" /f
exit

批量处理程序分析

添加注册表就三条批处理程序

  1. 第一行:右键菜单栏显示的文字
  2. 第二行:右键菜单栏显示的图标
  3. 第三行:点击右键菜单栏将要执行的程序,%1 是用于传递参数(文件路径)

image-20210204220341279

4、解决步骤

程序打包

将 Java 程序打包为可执行 jar 包,这里有打包教程:IDEA 打包可执行 jar 包

扫描二维码关注公众号,回复: 12556411 查看本文章

image-20210205000320833

批处理启动 jar 包

bat 默认只能获取到 1~9 个参数,分别用 %1%2%9 引用,如果传给 bat 的参数大于 9 个,就必须用 shift。

我们来测试一下 %1 是否能够获取到传给 bat 的第一个参数

image-20210205000602310


通过 bat 批处理程序执行 jar 包并传入笔记存储路径

编写 typora-tools.bat 批处理程序来启动此 jar 包(前车之鉴告诉我,这里的 jar 包不能使用相对路径),并传入笔记的存储路径(%1

为了防止对文件夹误操作,这里还是只允许操作单个文件,以免将整个笔记目录都递归了。。。

@echo off
if exist %1\ (echo dir or null is not permitted) else (java -jar C:\Users\Heygo\Desktop\Codes\typora-tools\typora-tools.jar %1)
pause

批处理程序测试

执行 typora-tools.bat "C:\Users\Heygo\Desktop\TestEncoding.md" 命令,测试批处理程序是否正确,从下面的结果看来貌似没啥问题~

image-20210205170632188

但是打开 Markdown 笔记一看,哟,乱码了。。。

image-20210205170515695

解决乱码问题

奇了怪了,我在 IDEA 中调试也没问题,使用 java -jar 执行就出现乱码问题,Java 代码使用的是 UTF8 编码,Typora 保存的 md 笔记也使用的是 UTF8 编码

在 cmd 下,常见运行 jar 包的命令为 java -jar typora-tools.jar,但这样可能会使得 java 运行时编码不正确导致各种错误,这时候我们可以运行 jar 包时,指定编码参数

java -Dfile.encoding=utf-8 -jar typora-tools.jar

测试乱码问题

添加上 -Dfile.encoding=utf-8 参数后,乱码问题得到解决

image-20210205171402016


修改 typora-tools.bat 批处理程序

在 typora-tools.bat 批处理程序中,执行 java -jar 命令时添加上 -Dfile.encoding=utf-8 参数

@echo off
if exist %1\ (echo dir not permitted) else (java -Dfile.encoding=utf-8 -jar C:\Users\Heygo\Desktop\Codes\typora-tools\typora-tools.jar %1)
pause

添加到右键菜单栏

将 typora-tools.bat 批处理程序添加到右键菜单栏中,依葫芦画瓢呗,照着将 Sublime Text 添加到右键菜单栏的批处理程序改一改

@ECHO OFF & PUSHD %~DP0 & TITLE
>NUL 2>&1 REG.exe query "HKU\S-1-5-19" || (
    ECHO SET UAC = CreateObject^("Shell.Application"^) > "%TEMP%\Getadmin.vbs"
    ECHO UAC.ShellExecute "%~f0", "%1", "", "runas", 1 >> "%TEMP%\Getadmin.vbs"
    "%TEMP%\Getadmin.vbs"
    DEL /f /q "%TEMP%\Getadmin.vbs" 2>NUL
    Exit /b
)
SET /P ST=输入a添加右键菜单,输入d删除右键菜单:
if /I "%ST%"=="a" goto Add
if /I "%ST%"=="d" goto Remove
:Add
reg add "HKEY_CLASSES_ROOT\*\shell\typora-tools"         /t REG_SZ /v "" /d "用 &typora-tools 执行"   /f
reg add "HKEY_CLASSES_ROOT\*\shell\typora-tools"         /t REG_EXPAND_SZ /v "Icon" /d "%~dp0typora-tools.ico" /f
reg add "HKEY_CLASSES_ROOT\*\shell\typora-tools\command" /t REG_SZ /v "" /d "%~dp0typora-tools.bat \"%%1\"" /f
 
exit
:Remove
reg delete "HKEY_CLASSES_ROOT\*\shell\typora-tools" /f
exit

%~dp0 表示更改当前目录为批处理本身的目录,呐,我把所需要的文件都拷贝到了【!添加∕删除右键菜单.bat】批处理文件的同级目录下

image-20210205101205521

添加到右键菜单栏后的效果

image-20210205165735147

点击【用 typora-tools 执行】,

程序优化:执行完后将 Markdown 笔记复制到粘贴板

Java 程序操作系统粘贴板:实现复制和粘贴的功能

/**
 * @ClassName ClipboardUtil
 * @Description TODO
 * @Author Oneby
 * @Date 2021/2/5 10:39
 * @Version 1.0
 */
public class ClipboardUtil {
    
    

    /***
     * @description: 将文本的复制到系统的粘贴板中
     * @param: text     复制到粘贴板中的文本
     * @return: void
     * @author Oneby
     * @date: 10:42 2021/2/5
     */
    public static void setClipboardString(String text) {
    
    
        // 获取系统剪贴板
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        // 封装文本内容
        Transferable trans = new StringSelection(text);
        // 把文本内容设置到系统剪贴板
        clipboard.setContents(trans, null);
    }

    /***
     * @description: 获取系统粘贴板的内容
     * @param:
     * @return: java.lang.String 粘贴板中的内容
     * @author Oneby
     * @date: 10:42 2021/2/5
     */
    public static String getClipboardString() {
    
    
        // 获取系统剪贴板
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();

        // 获取剪贴板中的内容
        Transferable trans = clipboard.getContents(null);

        if (trans != null) {
    
    
            // 判断剪贴板中的内容是否支持文本
            if (trans.isDataFlavorSupported(DataFlavor.stringFlavor)) {
    
    
                try {
    
    
                    // 获取剪贴板中的文本内容
                    String text = (String) trans.getTransferData(DataFlavor.stringFlavor);
                    return text;
                } catch (Exception e) {
    
    
                    e.printStackTrace();
                }
            }
        }

        return null;
    }

}

在程序的最后将 md 文件中的内容复制到粘贴板

image-20210205104619980

5、项目地址

oneby1314/typora-tools

猜你喜欢

转载自blog.csdn.net/oneby1314/article/details/113706310