批处理文件参数中有空格、双引号和管道符号

6

我有一个批处理文件,需要传递包含管道符和空格的参数。由于有空格,因此在传递参数时需要附加双引号。我需要去掉这些双引号并显示参数。通常,使用~可以让我做到这一点,但我认为我传递的特定参数会导致问题。如果我这样做:

[test1.bat]

call test2.bat "Account|Access Level|Description"

[test2.bat]

echo %1
echo %~1

运行test1.bat后,我得到了以下输出:

"Account|Access Level|Description"
'Access' is not recognized as an internal or external command, operable program or batch file.

那么我该如何去掉双引号并且仍然有一个可用的变量?
2个回答

4

您可以使用延迟扩展,因为它不会在意特殊字符。
唯一的问题是将参数内容传入变量,因为它只能通过百分号扩展进行传输。
但在您的情况下,这应该可以解决。

@echo off
setlocal DisableDelayedExpansion
set "str=%~1"
setlocal EnableDelayedExpansion
echo !str!

请注意,我先禁用了延迟扩展,这样!和^就不会被%1的扩展修改了。

编辑:可以使用以下命令来启用或禁用延迟扩展:

setlocal DisableDelayedExpansion
setlocal EnableDelayedExpansion

如果启用的话,它会添加另一种变量扩展方式(使用!variable!代替%variable%),主要是为了防止变量的括号块效应(在set /?中有描述)。
但是,使用!variable!扩展也会防止任何进一步解析的内容,因为延迟扩展是批处理行解析的最后阶段。详细情况可参考windows命令解释器cmd exe如何解析脚本

它起作用了!非常感谢!你能告诉我为什么它起作用吗?当我禁用或启用“延迟扩展”时,我在做什么? - SuperNES
你如何将一个双引号传递给它?每当我尝试像.\blah.cmd "asdf"" 123"这样引用调用批处理文件时,echo !str!输出两个双引号而不是一个。 - binki

1
@echo off
if "%~2"=="" (
    call %0 "Account|Access Level|Description" dummy
) ELSE (
    setlocal ENABLEEXTENSIONS
    for /F "tokens=*" %%A IN ("%~1") DO @echo.%%A
)

虽然不太美观,但它能用。在批处理文件中处理特殊字符总是很麻烦的...


你如何将双引号传递给这个程序?当我尝试使用(通过 .\play2.cmd "a b"" c" dummy)时,我得到了两个双引号的回显,而不是一个。 - binki

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