【发布时间】:2016-03-08 21:02:14
【问题描述】:
我有以下脚本sn-p:
if not {%2}=={} (
if not {%3}=={} (
"%~dp0otrtool\otrtool.exe" -x -e %2 -p %3 -D "%~dp1"" "%~f1"
)
)
如果我在输入中使用右括号,则会出现错误:
C:\>script.bat ).txt
输出如下:
"test"" can not be processed syntactically at this point.
C:\> "d:\Scripts\OTRTools\otrtool\otrtool.exe" -x -e -p -D "C:\"" "C:\)test"
看起来那个括号正在关闭其中一个 if 语句,我需要以某种方式对其进行转义。是否有可能对输入进行适当的清理?
【问题讨论】:
-
尝试使用引号而不是花括号。
-
除了使用先前评论建议的引号外,您在此部分还有一个额外的引号:
"%~dp1"" "%~f1"。以这种方式删除它:"%~dp1" "%~f1"。您的文件名为“).txt”吗?这是个坏主意…… -
好吧,我添加了附加引号,因为我遇到了反斜杠问题。
~dp1返回包含最后一个反斜杠的文件夹的绝对路径,例如D:\Stuff\,因此调用看起来像这样"D:\Scripts\OTRTools\otrtool\otrtool.exe" -x -e -p -D "D:\Stuff\" "D:\test.otrkey"。由于该工具是使用 gcc-cygwin 编译的,因此我认为反斜杠被识别为转义字符,因为我收到错误:“Missing argument: otrkey-file”,这表明"D:\Stuff\" "D:\test.otrkey"被视为单个参数跨度> -
关于文件名中的括号 - 这不是我的想法。我注意到这个错误是因为我向我的脚本传递了一个像“blabla (1).txt”这样的文件名。
\(\d\)是许多程序避免覆盖文件的默认模式。例如,如果 Google Chrome 下载的文件的名称已经存在于下载文件夹中,就会发生这种命名。 -
感谢您的想法,它现在运行良好。但是在我脚本的下一行中,括号也有同样的问题。请查看已编辑的问题。
标签: batch-file escaping sanitization