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

时间:2014-06-07 16:11:02

标签: batch-file dos substitution delayedvariableexpansion

感谢这个社区,我终于学会了如何在批量delayedExpansion块中远程使用感叹号。 (使用两个逃脱插入物不仅仅是一个,真棒)

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

示例:

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

我希望第二个“Hello”包含一个感叹号。 我已尝试在第5行进行各种子串替换,但无济于事。

帮助

2 个答案:

答案 0 :(得分:2)

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

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

:subroutine
echo %~1
exit /b

或带引号:     call:subroutine"%variable:!= ^^^!%"

在您的函数中,您需要展开{​​{1}}而不引用任何引号,因为%1参数中的插入符号总是奇数。

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

CALL

答案 1 :(得分:1)

问题可能不是如何将数据传递给子程序,而是如何将数据传递到子程序中

@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