批量清理参数

时间:2015-12-04 02:02:45

标签: batch-file escaping sanitization

我有以下脚本代码段:

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语句,我需要以某种方式逃避它。是否有可能对输入进行适当的消毒?

2 个答案:

答案 0 :(得分:0)

根据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 /?有关在批处理文件中使用条件的详细信息。

答案 1 :(得分:0)

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

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"
    )
)