3

このコミュニティのおかげで、感嘆符をエスケープしてバッチのdelayedExpansionブロックですぐに使用する方法をようやく学びました。(1つだけでなく2つのエスケープキャレットを使用してください、すばらしい)

しかし、エクスクラメーションマークを含む変数の内容をパラメータとしてバッチサブルーチンに渡す方法を見つけたり、理解したりできないようです。

例:

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

2 番目の「Hello」に感嘆符を含めたい。5行目で部分文字列置換のさまざまな順列を試しましたが、役に立ちませんでした。

ヘルプ

4

2 に答える 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
于 2014-06-08T20:55:07.553 に答える