批处理 - 如何在作为参数传递给子程序的字符串中回显感叹号?

时间:2018-05-18 21:54:28

标签: batch-file scripting windows-scripting

我有以下脚本:

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

SET /A countArgs=1

FOR %%p in (%pathListToCheck%) DO (
    IF NOT EXIST %%p (
        CALL :error "!countArgs!. Argument -> bla!"
        EXIT /B 1
    )
    SET /A countArgs+=1
)

:error
    ECHO ERROR  
    set x=%~1
    ECHO !x!
EXIT /B 0

不幸的是,感叹号没有得到echo d。我也尝试像^!^^!一样逃避它,但它不起作用。

我在这里使用延迟扩展来使更大的符号(>)起作用。如果我试图直接ECHO参数(ECHO %~1)它将失败。有关详细信息,请参阅我的previous question

如何解决这个问题?

感谢您的帮助......

2 个答案:

答案 0 :(得分:3)

如果您在功能中逃避感叹号和 dis 能够延迟扩展,它可以正常工作(虽然它会删除“延迟”替代 - 您不喜欢无论如何)

@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET /A countArgs=2
CALL :error "!countArgs!. Argument -> bla^!"
EXIT /B 1

:error
  setlocal disabledelayedexpansion
    for /f "delims=" %%a in ("%~1") do echo for:      %%a
    echo quoted:  "%~1"
  endlocal
EXIT /B 0

答案 1 :(得分:2)

你没有在answer中阅读/理解Stephans摘要 setlocal enabledelayedexpansion是消失的感叹号的原因 没有理由在您现有的代码中使用它。

如果你想在没有qoutes的情况下回复<|>&,你必须逃避这些。这可以通过代码来完成。

:: Q:\Test\2018\05\19\SO_50419709.cmd
@Echo off
SetLocal EnableExtensions DisableDelayedExpansion

SET /A countArgs=1

set "pathlisttocheck=%userprofile%,x:\x\x\"
FOR %%p in (%pathListToCheck%) DO (
    IF NOT EXIST %%p (
        CALL :error "%%countArgs%%. Argument -> bla!  %%~p"
        EXIT /B 1
    )
    SET /A countArgs+=1
)
EXIT /B 1

:error
ECHO ERROR  
set "x=%~1"
set "x=%x:>=^>%"
ECHO %x%
EXIT /B 0

示例输出:

> Q:\Test\2018\05\19\SO_50419709.cmd
ERROR
2. Argument -> bla! x:\x\x\