批量清理参数

Batch sanitize arguments

我有以下脚本片段:

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 语句,我需要以某种方式转义它。是否有可能适当地清理输入?

按照 SomethingDark and Aacini 的建议应用修复的批处理代码:

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

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

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

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

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