【问题标题】:Batch sanitize arguments批量清理参数
【发布时间】: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


【解决方案1】:

按照SomethingDarkAacini 的建议应用了修补程序的批处理代码:

if not "%~2" == "" (
    if not "%~3" == "" (
        "%~dp0otrtool\otrtool.exe" -x -e "%~2" -p "%~3" -D "%~dp1" "%~f1"
    )
)

在字符串比较时使用%~2 而不是仅使用%2 很重要,以避免继续执行,例如if not ""second parameter"" == "",因为这又是一个语法错误。

在命令提示符窗口中运行call /? 以获取有关%~2(不带引号的第二个参数)、%~dp1(不带引号的第一个参数的驱动器和路径)和%~f1(带驱动器的第一个参数的文件名)的详细信息和不带引号的路径)和if /? 了解有关在批处理文件中使用条件的详细信息。

【讨论】:

    【解决方案2】:

    如果此问题是由路径末尾的反斜杠引起的(如您在评论中指出的那样),则只需将其删除:

    set "myPath=%~dp1"
    if "%myPath:~-1%" equ "\" set "myPath=%myPath:~0,-1%"
    if not "%~2" == "" (
        if not "%~3" == "" (
            "%~dp0otrtool\otrtool.exe" -x -e "%~2" -p "%~3" -D "%myPath%" "%~f1"
        )
    )
    

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      相关资源
      最近更新 更多