Batch file 在批处理子例程调用中将感叹号作为参数传递

Batch file 在批处理子例程调用中将感叹号作为参数传递,batch-file,dos,substitution,delayedvariableexpansion,Batch File,Dos,Substitution,Delayedvariableexpansion,多亏了这个社区,我终于学会了如何在批处理延迟扩展块中立即使用逃逸标记。 (使用两个转义插入符号,而不仅仅是一个,太棒了) 但我似乎无法找到或弄清楚如何将包含感叹号的变量的内容作为参数传递给批处理子例程 例如: @echo off setLocal EnableDelayedExpansion set variable=Hello^^! echo "!variable!" call :subroutine "!variable:^^!=^^!!" pause exit :subroutine e

多亏了这个社区,我终于学会了如何在批处理延迟扩展块中立即使用逃逸标记。 (使用两个转义插入符号,而不仅仅是一个,太棒了)

但我似乎无法找到或弄清楚如何将包含感叹号的变量的内容作为参数传递给批处理子例程

例如:

@echo off
setLocal EnableDelayedExpansion
set variable=Hello^^!
echo "!variable!"
call :subroutine "!variable:^^!=^^!!"
pause
exit

:subroutine
echo "%~1"
exit/b
输出:

"Hello!"
"Hello"
Press any key to continue . . .
我希望第二个“你好”包括一个感叹号。 我在第5行尝试了各种子串替换的排列,但没有成功


帮助

可能问题不在于如何将数据传递给子例程,而在于如何获取其中的数据

@echo off

    setlocal enabledelayedexpansion

    set "var=Hello^!"

    setlocal disabledelayedexpansion
    echo %var%
    call :echo1 %var%
    call :echo2 var
    endlocal

    setlocal enabledelayedexpansion
    echo !var!
    call :echo1 !var!
    call :echo2 var
    endlocal

    endlocal
    exit /b

:echo1
    setlocal disabledelayedexpansion
    echo %~1
    endlocal
    goto :eof

:echo2
    setlocal enabledelayedexpansion
    echo !%~1!
    endlocal
    goto :eof

您需要一种不同的方式来替换变量,以及更多的插入符号

@echo off
setLocal EnableDelayedExpansion
set variable=Hello^^!
echo "!variable!"
call :subroutine %variable:!=^^^^^^^^^^!%
exit /b

:subroutine
echo %~1
exit /b
或加上引号: 调用:子例程“%variable:!=^^^!%”

在函数中,您需要展开
%1
,不带任何引号,因为
调用
参数中插入符号的数量总是奇数

但无论如何,尝试这样的事情是个坏主意。
我同意Aacini的观点,即您应该使用参考传递。
这是处理任何可能内容的唯一方法

@echo off
setLocal EnableDelayedExpansion
set variable=Hello^^!
echo "!variable!"
call :subroutine variable
exit /b

:subroutine
echo !%1!
exit /b
改为传递变量的名称(按引用传递)