批处理 %~f1 有效,但 %~dp1 由于空格而失败

Batch %~f1 works but %~dp1 fails because of spaces

我正在尝试创建一个批处理脚本来将文件的快捷方式发送到我的开始菜单,但是我 运行 在设置 "Start in" 选项时遇到了麻烦。我正在使用 Shortcut from Optimum X 来做这件事,这可能是他们十年前的程序的错误,而不是我的代码。

运行

shortcut /f:"%targetfolder%\%fileName%.lnk" /w:"%~f1" /a:c /t:%1

按预期工作并创建一个快捷方式 "Start in" 设置为文件的目录。但是运行

shortcut /f:"%targetfolder%\%fileName%.lnk" /w:"%~dp1" /a:c /t:%1

遇到 space 时失败,例如,如果路径在 Program Files 中,则错误为

"The Parameter "文件"无效

命令语法不正确

对不起,如果这还不够,我知道的 Batch 很少。

您的问题不在于 space,而是如何处理标准参数。

在您的情况下,您没有将数据传递给内部命令,而是传递给将使用自己的解析器(default C startup code)的外部可执行文件。对于此解析器,反斜杠后跟引号是不结束参数的转义引号。

由于您的 %~dp1 以反斜杠结尾,它转义了引号,因此参数一直持续到第一个未加引号的 space,在您的情况下 Program 之后 [=14] =] 开关。因此,Files(在 /t 开关中)未被识别为有效参数。

通常的方法是用

之类的东西删除结尾的反斜杠
for %%a in ("%~dp1.") do (
    shortcut /f:"%targetfolder%\%fileName%.lnk" /w:"%%~fa" /a:c /t:"%~1"
)

这里使用for命令处理文件路径加点。这就是为什么当我们检索到引用元素 (%%~fa) 的完整路径时,不会包含结尾的反斜杠。

但是,如果目标文件夹是驱动器的根目录,则此方法将不起作用。结尾的反斜杠不能被删除。因此,另一种方法是通过简单地转义反斜杠来避免引号转义

shortcut /f:"%targetfolder%\%fileName%.lnk" /w:"%~dp1\" /a:c /t:"%~f1"

现在引号前面有两个反斜杠,这两个反斜杠将被视为转义反斜杠后跟参数的结束引号。