setlocal ENABLEDELAYEDEXPANSION
をcmdスクリプトに設定している場合、!コマンドのパラメータとして使用したいですか?
@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang!
echo I still want to go out with a bang^!
それが私が見つけたものです(^^)
@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang^^!
通常_^^!
_は機能しますが、引用符で囲む必要があるのは_^!
_のみです。
_echo I want to go out with a bang^^!
echo He said "Bang^!"
_
これは、バッチパーサーのエスケープメカニズムの結果です。
最初にパーサーが行を解析し、キャレットが次の文字をエスケープします。この場合、&|<>()"<linefeed>
に影響がありますが、引用符の内側はすべての文字が「通常」であり、キャレットはそれ自体は効果がありません。
遅延展開では追加の解析ステップが続き、キャレットには次の文字のエスケープ文字もありますが、_!
_および_^
_のみに影響し、この解析ステップでは引用符は無視されます。この追加ステップは、行に少なくとも1つの_!
_がある場合にのみ実行されます。
_setlocal DisableDelayedExpansion
echo DisableDelayedExpansion
echo one caret^^
echo one caret^^ bang! "boom^!"
echo(
setlocal EnableDelayedExpansion
echo EnableDelayedExpansion
echo one caret^^
echo none caret^^ bang^^! "boom^!"
_
----出力------
_DisableDelayedExpansion
one caret^
one caret^ bang! "boom^!"
EnableDelayedExpansion
one caret^
none caret bang! "boom!"
_
[〜#〜] edit [〜#〜]
コンテキストに応じて、必要なさまざまなエスケープ順列をよりわかりやすく示す、少し変更された例を次に示します。異常なエスケープを必要とする唯一のケースは、遅延展開がオンで、行に少なくとも1つの_!
_が存在する最後の例です。
_@echo off
setlocal DisableDelayedExpansion
echo DisableDelayedExpansion
echo caret^^ "caret^"
echo caret^^ bang! "caret^ bang!"
echo(
setlocal EnableDelayedExpansion
echo EnableDelayedExpansion
echo caret^^ "caret^"
echo caret^^^^ bang^^! "caret^^ bang^!"
_
-出力-
_DisableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
EnableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
_
[〜#〜] disabledelayedexpansion [〜#〜]および[〜#〜で感嘆符変数を使用する方法の例を以下に示します] enabledelayedexpansion [〜#〜]状態。
@echo off
setlocal DISABLEDELAYEDEXPANSION
set DB_password=encrypt!Pws
echo %DB_password%
SETLOCAL ENABLEDELAYEDEXPANSION
echo !DB_password!
ありがとう。この貴重な点に追加するために、スクリプトに値に「!」が含まれる変数が含まれている場合、次の方法でその値をそのままレンダリングします。
@ echo off SETLOCAL EnableDelayedExpansion set/P omg =感嘆符を含む値を入力してください: echo Traditional:%omg% echo Alternative:!omg! pause