【问题标题】:Batch file parameter with spaces, double quotes, pipes带有空格、双引号、管道的批处理文件参数
【发布时间】:2011-07-11 11:46:32
【问题描述】:

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

[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.

那么如何去掉双引号,仍然有一个可用的变量呢?

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

    您可以使用延迟扩展,因为它不关心特殊字符。
    唯一的问题是将参数内容放入变量中,因为它只能通过百分比扩展来传递。
    但在你的情况下,这应该可行。

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

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

    编辑:可以使用

    禁用或启用延迟扩展
    setlocal DisableDelayedExpansion
    setlocal EnableDelayedExpansion
    

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

    但是!variable! 的扩展也阻止了任何进一步解析的内容,因为延迟扩展是批处理行解析的最后阶段。
    详细解释在 how does the windows command interpreter cmd exe parse scripts

    【讨论】:

    • 成功了!太感谢了!你能告诉我为什么它有效吗?当我禁用或启用“延迟扩展”时我在做什么?
    • 你如何将一个双引号传递给这个?每当我尝试调用像.\blah.cmd "asdf"" 123" 那样引用它的批处理文件时,echo !str! 会输出两个双引号而不是一个。
    【解决方案2】:
    @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)时,我得到两个双引号而不是 1。
    猜你喜欢
    • 2015-07-21
    • 2014-04-17
    • 2011-01-30
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2011-10-04
    相关资源
    最近更新 更多