将 Typora 小工具添加到右键菜单中
1、参考资料
- Windows下在所有的文件添加右键菜单功能
- 程序添加右键菜单运行并传右键文件全名
- bat 传递参数
- 批处理判断是文件还是文件夹的几种方法
- %~dp0是什么意思
- Java丨Cmd运行Jar出现乱码问题
- Java操作系统剪贴板(Clipboard)实现复制和粘贴
2、前言
之前写了一款 Typora 小工具,使用起来吧不是很方便,每次都要进入 IDEA 中修改笔记存储路径,然后点击【Run】运行该程序
之前我写过一篇博客 将Sublime Text添加到右键菜单中,于是我就突发奇想:
- 将 Java 程序打包为可执行 jar 包
- 编写 typora-tools.bat 批处理程序来启动此 jar 包,并传入笔记的存储路径
- 将 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
是用于传递参数(文件路径)
4、解决步骤
程序打包
将 Java 程序打包为可执行 jar 包,这里有打包教程:IDEA 打包可执行 jar 包
批处理启动 jar 包
bat 默认只能获取到 1~9 个参数,分别用 %1
、%2
… %9
引用,如果传给 bat 的参数大于 9 个,就必须用 shift。
我们来测试一下 %1
是否能够获取到传给 bat 的第一个参数
通过 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"
命令,测试批处理程序是否正确,从下面的结果看来貌似没啥问题~
但是打开 Markdown 笔记一看,哟,乱码了。。。
解决乱码问题
奇了怪了,我在 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
参数后,乱码问题得到解决
修改 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】批处理文件的同级目录下
添加到右键菜单栏后的效果
点击【用 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 文件中的内容复制到粘贴板