web-dev-qa-db-ja.com

感嘆符をエスケープするにはどうすればよいですか! cmdスクリプトで?

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^!
69
Andy Morris

それが私が見つけたものです(^^)

@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang^^!
78
FrVaBe

answer of FrVaBe への追加のコメント。

通常_^^!_は機能しますが、引用符で囲む必要があるのは_^!_のみです。

_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!"
_
61
jeb

[〜#〜] disabledelayedexpansion [〜#〜]および[〜#〜で感嘆符変数を使用する方法の例を以下に示します] enabledelayedexpansion [〜#〜]状態。

@echo off
setlocal DISABLEDELAYEDEXPANSION
set DB_password=encrypt!Pws
echo %DB_password%
SETLOCAL ENABLEDELAYEDEXPANSION
echo !DB_password!
7
Aditya Sharma

ありがとう。この貴重な点に追加するために、スクリプトに値に「!」が含まれる変数が含まれている場合、次の方法でその値をそのままレンダリングします。

 @ echo off 
 SETLOCAL EnableDelayedExpansion 
 set/P omg =感嘆符を含む値を入力してください:
 echo Traditional:%omg%
 echo Alternative:!omg!
 pause 
6