如何在批处理脚本中将感叹号传递给调用标签例程并启用delayedexpansion?

时间:2017-10-28 16:18:32

标签: batch-file escaping delayedvariableexpansion

我读过this post,这在大多数情况下会有所帮助,而this post似乎是重复的,但我无法让它发挥作用。

免责声明:禁用/启用延迟扩展可以解决此问题,但这样做很烦人,除非可以禁用整个脚本。我很好奇是否有更直接的方法。

我使用这个brilliantly simple colorEcho脚本,有时我只想打印感叹号。正如该帖子所示(但未能解决),它不会打印感叹号。

摄制:

@echo Off
SETLOCAL EnableDelayedExpansion

rem Initialize backspace-space-backspace
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do     rem"') do (
  set "DEL=%%a"
)

rem Using it
call :colorEcho 0a "Give me an exclamation!"
echo.
pause
GOTO :EOF

rem The actual color-print hack
:colorEcho
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1i

给出:

enter image description here

我试过了:

  • call :colorEcho 0A "Ex^!"以及^^^!
  • 等变体
  • set excl=^^!然后CALL :colorEcho "Foo!excl!"
  • 一些具有更多/更少逃避的变种
  • 创建了一个没有colorEcho的简化例程,但遇到了同样的问题:

    :test
    rem How to call :test with %1 containing an excl mark
    echo %1
    exit /B
    

也许这是不可能的,我应该不想输出感叹号,或者我应该使用已经提到的DisableDelayedExpansion。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用此

set "ex=^^^!"
call :colorEcho 0a "Give me an exclamation%%ex%%"

但更好的方法是使用变量9ns来调用内容。 因为call命令有令人讨厌的副作用