我有以下脚本:
@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
如何解决这个问题?
感谢您的帮助......
答案 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\