带有空格,双引号,管道的批处理文件参数

Sup*_*NES 6 windows batch-file

我有一个批处理文件,需要传递一个包含管道和空格的参数.由于空格,在传入参数时需要将双引号附加到参数上.我需要去掉那些双引号并回显参数.通常,使用〜会让我这样做,但我认为我传入的具体参数会导致问题.如果我这样做:

[test1.bat]

call test2.bat "Account|Access Level|Description"
Run Code Online (Sandbox Code Playgroud)

[test2.bat]

echo %1
echo %~1
Run Code Online (Sandbox Code Playgroud)

并运行test1.bat,我得到这个输出:

"Account|Access Level|Description"
'Access' is not recognized as an internal or external command, operable program or batch file.
Run Code Online (Sandbox Code Playgroud)

那么如何删除双引号并仍然有一个可用的变量?

jeb*_*jeb 4

您可以使用延迟扩展,因为它不关心特殊字符。
唯一的问题是将参数内容放入变量中,因为它只能通过百分比扩展进行传输。
但就你而言,这应该有效。

@echo off
setlocal DisableDelayedExpansion
set "str=%~1"
setlocal EnableDelayedExpansion
echo !str!
Run Code Online (Sandbox Code Playgroud)

备注,我首先禁用延迟扩展,所以 ! 和 ^ 不会被 %1 的扩展所修改

编辑:可以禁用或启用延迟扩展

setlocal DisableDelayedExpansion
setlocal EnableDelayedExpansion
Run Code Online (Sandbox Code Playgroud)

如果启用,它会添加另一种扩展变量的方法(!variable!而不是%variable%),主要是为了防止变量的括号块效应(在 中描述set /?)。

但是扩展!variable!也阻止了任何进一步解析的内容,因为延迟扩展是批处理行解析的最后阶段。
详细解释见 Windows命令解释器cmd exe如何解析脚本