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

Batch file 带引号和空格的批处理参数,batch-file,escaping,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,无论我尝试什么转义序列,情况都不太好(我在堆栈溢出上发现了几个): 使用双引号转义会以某种方式传递

批处理文件
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,无论我尝试什么转义序列,情况都不太好(我在堆栈溢出上发现了几个):

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

>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
(或任何其他
%

但只要耍点小把戏,这是可能的

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

蝙蝠看起来像

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“这是“参数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^!"

在进入批处理文件之前,使用此选项启用启用的延迟模式,如果调用的批处理文件不能正确处理此情况,则可能会在调用的批处理文件中产生一些其他不希望的副作用。

可能重复@BenjyKessler:我在那里阅读了答案,在我的问题中,您会发现我尝试了这两种方法,双引号和扬抑转义字符。它们都不起作用。但是完全不用编辑脚本就可以完成吗?这就是我阅读问题的方式。我想这是为了工作,有一个脚本部署系统,需要对所有更改进行彻底的检查和测试,这可能会导致延迟数天或数周。没错,我添加了一个不需要修改脚本的解决方案
cmd /v:on /c set ^^^"q=^^^"^^^" ^& test "This is ^!q^!Argument 2^!q^!"