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

4

感谢这个社区,我终于学会了如何在批处理延迟扩展块中转义感叹号以立即使用。(需要使用两个脱字符来进行转义, 很棒)

但是我似乎找不到或者不知道如何将包含感叹号的变量的内容作为参数传递给批处理子程序。

例如:

@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行使用各种子字符串替换的排列组合,但都没有成功。
帮帮我。

1
传递变量的名称(通过引用传递)。 - Aacini
2个回答

2
你需要采用不同的方式进行变量替换,并且要更加注意符号。
@echo off
setLocal EnableDelayedExpansion
set variable=Hello^^!
echo "!variable!"
call :subroutine %variable:!=^^^^^^^^^^!%
exit /b

:subroutine
echo %~1
exit /b

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

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

但总的来说,尝试这样的事情是一个坏主意。
我同意Aacini的观点,应该使用按引用传递的方式。
这是处理任何可能内容的唯一方法。

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

:subroutine
echo !%1!
exit /b

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接