带引号和空格的批处理参数

7
批处理文件args.bat是用于测试目的的:
@echo off
echo Arguments 1 to 4:
echo.%~1
echo.%~2
echo.%~3
echo.%~4

批处理文件使用~来去除前导和尾随引号,它应该向用户显示以下值:
Argument 1
This is "Argument 2".

对于第一个参数,很容易:

args.bat "Argument 1"

然而,对于第二个参数,无论我尝试什么转义序列(我在Stack Overflow上找到了几个),都无法正常工作:

// 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
@BenjyKessler:我读了那里的答案,在我的问题中,你会发现我尝试过双引号和插入转义字符。但是它们都不起作用。 - Thomas Weller
1个回答

7

你不能将这样的参数带入到%1(或任何其他%<n>)中。

但有一个小技巧可以实现。

args.bat arg1 "This is !q!Argument 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"""来调用它。

当您不想使用这种技术时,您也可以决定自己解析参数。
然后您需要从%*中获取所有参数并遍历每个字符。

编辑
如果您无法修改脚本,则可以对第一种解决方案进行修改。

在命令提示符中。

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^!"

在进入批处理文件之前启用延迟模式,这会在被调用的批处理文件中产生一些不希望出现的副作用,如果未正确处理此情况。


3
不进行脚本编辑,这个问题能否得到解决?这是我理解的问题。我想这可能是为工作而考虑的,且已经有一个脚本部署系统,需要对所有更改进行全面审核和测试,这可能导致长达数天甚至数周的延迟。 - SomethingDark
你说得对,我增加了一个不需要修改脚本的解决方案。 - jeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接