2016-07-31 6 views
1

私は物事を整理するために別のバッチファイルにエコーする非常に単純なバッチスクリプトを書こうとしています。どのようにエスケープする%%

@echo if %cd%==C:\Users\whoever\Desktop msg * success 

私は「%でcd%」に置くので、それは、現在のディレクトリをエコーし​​ます。これを行う一方で、私は私のような何かをした場合のことに気づきました。どのようにすれば、エスケープして、代わりに%cd%にエコーすることができますか:C:\Users\whoever\desktop\file

ありがとうございました!

+1

1%をエスケープして解釈されないようにするには、%%を使用してください。 – codechurn

+0

@codechurn %%のパーセントが既存の変数名の周りにある場合を除きます。これらのケースでは、私が投稿した回答の回避策がなぜ必要なのかを見るには 'echo %% cd %%" 'を試してください。 – dxiv

+2

@dxiv問題はコマンドラインでのみ発生し、バッチファイルでは倍増で十分です – jeb

答えて

3

少し直感的ではありません。

バッチファイル内

%は別の%でエスケープされています。コマンドラインでecho %%cd%%

あなたが本当にそれを免れることはできないが、「偽エスケープ」キャレットでそれらを:cmd%varName%を示しているためecho ^%cd^%は、トリックを行い、 varnameが定義されていない場合、定義されていない変数cd^を表示しようとすると、代わりに%cd%が表示されます(パーサーはキャレットを呑み込んでしまいます)。開始キャレットは本当に必要ではありませんが、 "偽のエスケープ"をより一貫して行います。

C:>@echo if ^%cd^%==C:\Users\whoever\Desktop msg * success 
if %cd%==C:\Users\whoever\Desktop msg * success 
C:>type t.bat 
@echo if %%cd%%==C:\Users\whoever\Desktop msg * success 
C:>t 
if %cd%==C:\Users\whoever\Desktop msg * success 
C:> 
+0

実際には、コマンドラインでエスケープすることはできません。キャレットはパーセント記号をエスケープしませんが、 'cd ^' – jeb

+0

@jebのように未定義の変数名を作成するだけです。それにもかかわらず、それは意図されたように動作します(変数が定義されるまではありません)。 – Stephan

+0

本当にありがとうございます!これはトンを助けました! – Silver

2

私はエレガントなワンライナーを知りませんが、次のように動作します:

@echo off 
set "random=cd" 
echo %%%random%%% = "%cd%" 
set "random=" 

出力:一時変数がをする必要がないこと

%cd% = "C:\Users\whoever\desktop\file" 

注意randomという名前です。予約された名前なので、他の定義済みの変数を上書きする可能性は低くなります。


構築物を繰り返し使用する場合には[EDIT]代替、(専用の環境変数pctを用いを犠牲にして)以下のようになります。

エスケープをすることができる
@echo off 
set "pct=%%" 
echo %pct%cd%pct% = "%cd%" 
+0

予約された名前を使用することは悪い考えです。* normal *の動作を変更すると、この場合ランダムな機能はもう働きません。ここで余分な変数は必要ありません。あなたの* pct *の使用法はコマンドラインでのみ必要ですが、キャレットソリューションより安全です – jeb

+0

ありがとう!私はすべての助けに感謝します! – Silver

+0

@jeb 'この場合、ランダム関数の機能はもう動作しません。 'これは一時的にしか使用されず、投稿された例はあなたが言及した理由のために非常に次の' set "random =" ' – dxiv

関連する問題