2013-01-01 4 views
14

私はアンパサンドを含む変数を持っています。最初のものを含む別の変数を作成する必要があります。私は "&"の文字can be escaped with carret (^)を知っていますが、変数内のテキストをエスケープする方法はわかりません。変数のアンパサンドをエスケープする - バッチを勝つ

set Name1 = Red ^& Green 
set Name2 = %Name1% ^& Blue 

「グリーン」は、内部または外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。

アンパサンドを含む変数を "エコー"できない - 同じエラーが発生する。それが評価されているので、

私は出力にその内容を入力するか、残念ながら

type "%Name1%.txt" 
type "%Name2%.txt" 

答えて

18

最も簡単な解決策は、割り当てのために引用符を使用することで、拡大を遅らせました。これにより、エスケープする必要がなくなります。

@echo off 
setlocal enableDelayedExpansion 
set "Name1=Red & Green" 
set "Name2=!Name1! & Blue" 
echo !Name2! 

引用符付きのテキストと引用符で囲まれていないテキストが混在している場合は、一部の文字をエスケープする必要があります。しかし、それは最初の割り当てにのみ必要です。遅延拡張を使用する場合、変数の内容をエスケープする必要はありません。バッチスクリプトで...

for /f "delims= usebackq" %a in (`echo "First & ? * Last"`) do echo # %~a 

@echo off 
setlocal enableDelayedExpansion 
set var="This & that" ^& the other thing. 
echo !var! 
+0

enableDelayedExpansionを使用すると、変数を使用することができます。したがって、 ""%Name1%.txt "< - タイプが動作します。今のところ、これは最善の解決策のように見えます。ありがとう – BearCode

+0

最も簡単な解決策ではない、私の答えを参照してください –

5

のような変数によって指定されたファイルを操作するために、変数を使用する必要がある、あなたは、アンパサンドをエスケープ倍増する必要があります変数値を二重引用符で囲んでください。

set Name1=Red ^^^& Green 
set Name2=%Name1% ^& Blue 

しかし、Name2が使用される場合には、別のエスケープセットも追加する必要があります。それは大きな痛みになる。

set Name1=Red ^^^^^& Green 
set Name2=%Name1% ^^^& Blue 

または引用(推奨)

set "Name1=Red ^& Green" 
set "Name2=%Name1% ^& Blue" 
0

つを使用するソリューションは十分に一般的であるどちらも、心に来て、彼らは両方とも "仕事":

  1. 常に保ちます前回の解決策に記載されているように、引用符で囲んだものを削除し、必要に応じて削除します。
  2. 再引用&年代: セット名2 =%NAME1:& =^&%^ &ブルー
+1

構文それ自身のアンパサンドをエスケープしても、エスケープするのはずっと少ない彼女たち。 –

-2

最も簡単な解決策は、このいずれかになります#2 doesnのための

for /f "delims= usebackq" %%a in (`echo "First & ? * Last"`) do echo # %%~a 

または

for /f "delims= usebackq" %%a in (`echo "%~1"`) do echo # %%~a 
+0

これは、環境変数に関する質問には答えていません – dbenham

+0

このページでは "環境"という言葉さえも言いますか?あなたの答えの鉱山とは異なり、実際には入力パラメータが関係します。あなたのハードコードされた文字列でのみ動作します。 私は誰かがここで少し苦いです... –

+0

もちろん、私のソリューションは環境変数に対しても機能しますが、違いはなく、何も特別なものはありません。あなたはそれをとてもよく知っています。 –

関連する問題