我在系统中注册了一个URL协议,使用以下脚本启动批处理文件"showPath.bat"。
如果我直接双击运行批处理文件,我可以正确看到它的路径。但是如果我使用上面注册的URL协议启动批处理文件,即在Chrome中浏览"ProtoTest://",批处理文件会运行,但显示路径为"C:\Windows\system32"而不是批处理文件的目录。因此,我认为使用URL协议启动的应用程序会以system32作为工作目录运行。现在,当从浏览器使用URL协议启动批处理文件时,如何使其从自己的目录运行--而无需修改批处理文件本身。只有URL协议可以从我的端口更改。
@echo off
reg add HKEY_CLASSES_ROOT\ProtoTest /t REG_SZ /d "My Description" /f
reg add HKEY_CLASSES_ROOT\ProtoTest /v "URL Protocol" /t REG_SZ /d "" /f
reg add HKEY_CLASSES_ROOT\ProtoTest\shell /f
reg add HKEY_CLASSES_ROOT\ProtoTest\shell\open /f
reg add HKEY_CLASSES_ROOT\ProtoTest\shell\open\command /t REG_SZ /d "C:\TestFolder\showPath.bat" /f
pause
"showPath.bat"文件的内容只是展示当前工作目录,即:
@echo off
SET var=%cd%
ECHO %var%
pause
如果我直接双击运行批处理文件,我可以正确看到它的路径。但是如果我使用上面注册的URL协议启动批处理文件,即在Chrome中浏览"ProtoTest://",批处理文件会运行,但显示路径为"C:\Windows\system32"而不是批处理文件的目录。因此,我认为使用URL协议启动的应用程序会以system32作为工作目录运行。现在,当从浏览器使用URL协议启动批处理文件时,如何使其从自己的目录运行--而无需修改批处理文件本身。只有URL协议可以从我的端口更改。
%CD%
返回当前工作目录,这与批处理脚本的父目录不同,您可以使用%~dp0
(包括尾部反斜杠)来检索它... - aschipflcd /d "%~dp0"
。 - Stephanreg add HKEY_CLASSES_ROOT\ProtoTest\shell\open\command /t REG_EXPAND_SZ /d "%ComSpec% /C \"cd /D C:\TestFolder ^& call showPath.bat\"" /f
- aschipflreg add
命令行中最外层的引号;您也可以使用REG_SZ
类型,因为批处理文件已经展开了%ComSpec%
(因为注册表键包含了对cmd.exe
字面路径的引用)... - aschipfl