带引号和空格的批参数

时间:2015-05-10 22:45:29

标签: batch-file escaping

批处理文件args.bat用于测试目的:

@echo off
echo Arguments 1 to 4:
echo.%~1
echo.%~2
echo.%~3
echo.%~4

批处理文件正在使用~删除前导引号和尾随引号,并且应该向用户显示以下值:

Argument 1
This is "Argument 2".

对于论证1,这很简单:

args.bat "Argument 1"

但是,对于参数2,无论我尝试什么转义序列(我在堆栈溢出中找到了几个),事情都不能正常工作:

// Didn't expect this to work, but for completeness
>args.bat "Argument 1" "This is "Argument 2"."
Arguments 1 to 4:
Argument 1
This is "Argument
2"."

以双引号转义会以某种方式传递双引号:

>args.bat "Argument 1" "This is ""Argument 2""."
Arguments 1 to 4:
Argument 1
This is ""Argument 2"".

使用抑扬符逃脱:

>args.bat "Argument 1" "This is ^"Argument 2^"."
Arguments 1 to 4:
Argument 1
This is "Argument
2"."

使用反斜杠逃脱:

>args.bat "Argument 1" "This is \"Argument 2\"."
Arguments 1 to 4:
Argument 1
This is \"Argument
2\"."

请确保我尝试了其他一些东西(最终想到强制解决方案,但先问问题),每个都会产生有趣的输出,但从来没有我想要的东西:

>args.bat "Argument 1" ^"This is ^^"Argument^" 2^^"."
Arguments 1 to 4:
Argument 1
This is "Argument" 2".

是否可以在不更改批处理文件的情况下将参数传递给我的批处理文件?如果没有,有没有办法在特殊模式下运行cmd,以便它像我想要的那样处理参数?

我见过搜索和替换双引号的解决方案,但我真的希望批处理文件保持不变。

1 个答案:

答案 0 :(得分:3)

你不能将这样的论点带入%1(或任何其他%<n>)。

但是有一点小技巧就可以了。

args.bat arg1“这是!q!参数2!q!”

args.bat看起来像

setlocal EnableDelayedExpansion
set "q=""
echo * = %*
echo 1 = %~1
echo 2 = %~2

或者这也是可能的

@echo off
setlocal EnableDelayedExpansion
set "arg1=%~1"
set "arg2=%~2"
echo * = %*
echo 1 = %arg1:""="%
echo 2 = %arg2:""="%

然后您可以使用args.bat "This is ""Argument 1"""

来调用它

当您不想使用此技术时,您也可以决定自己解析参数 然后你需要从%*获取所有argumtents并遍历每个角色。

修改
如果您根本无法修改脚本,那么您可以使用第一个解决方案进行一次修改。

在命令提示符下。

C:\SomeDir> cmd /V:ON 
C:\SomeDir> set "q=""
C:\SomeDir> args.bat argument1 "This is ^!q^!Argument 2^!q^!"

或作为单行

cmd /v:on /c set ^^^"q=^^^"^^^" ^& test "This is ^!q^!Argument 2^!q^!"

使用此功能可在输入批处理文件之前启用启用的延迟模式,如果它无法正确处理此情况,则在调用的批处理文件中可能会出现一些其他不良副作用