我正在尝试创建一个批处理脚本来将文件的快捷方式发送到我的开始菜单但是我在设置“开始”选项时遇到了麻烦。我正在使用Shortcut from Optimum X来执行此操作,这可能是他们十年前程序中的错误,而不是我的代码。
%~f1
= C:\Program Files (x86)\Example\Example.exe
%~dp1
= C:\Program Files (x86)\Example\
正在运行
shortcut /f:"%targetfolder%\%fileName%.lnk" /w:"%~f1" /a:c /t:%1
按预期工作,并创建一个快捷方式,将“开始”设置为文件的目录。但是运行
shortcut /f:"%targetfolder%\%fileName%.lnk" /w:"%~dp1" /a:c /t:%1
遇到空格时失败,例如路径在Program Files中,错误是
“参数”文件“无效
命令的语法不正确“
很抱歉,如果这还不够,我知道很少批。
答案 0 :(得分:1)
您的问题不是空格,而是标准参数的处理方式。
在您的情况下,您不是将数据传递给内部命令,而是传递给将使用其自己的解析器(default C startup code)的外部可执行文件。对于此解析器,反斜杠后跟引号是一个转义引号,不会结束参数。
当你的%~dp1
以反斜杠结尾时,它会转义引号,因此参数会一直持续到第一个未加引号的空格,在Program
开关中的/t
之后。因此,Files
(在/t
开关中)不会被识别为有效参数。
通常的方法是用
之类的东西删除结尾反斜杠for %%a in ("%~dp1.") do (
shortcut /f:"%targetfolder%\%fileName%.lnk" /w:"%%~fa" /a:c /t:"%~1"
)
此处for
命令用于处理带有添加点的文件路径。这就是为什么当我们检索引用元素(%%~fa
)的完整路径时,不会包含结尾反斜杠。
但是,如果目标文件夹是驱动器的根目录,则此方法将不起作用。无法删除结尾反斜杠。所以,另一种方法是通过简单地转义反斜杠来避免引用scape
shortcut /f:"%targetfolder%\%fileName%.lnk" /w:"%~dp1\" /a:c /t:"%~f1"
现在引号前面有两个反斜杠,它们将被视为转义反斜杠,后跟参数的结束引号。