バックスラッシュはあなたの問題とは何の関係もありません。変数の割り当てにも問題はありません。:-)
問題は&
文字です。同じ入力行で複数のコマンドを実行できるのは、複合コマンド演算子です。をリテラルにしたいのですが、&
ECHO しようとすると演算子として扱われます。たとえば、echo this&echo that
「this」の後に「that」が続く 2 行の出力を画面に出力します。
バッチ行は、実行する前に解析する必要があります。パーサーは、コマンドと演算子を識別する必要があります。の展開は%texty%
、コマンドと演算子が解析される前に発生するため、パーサーは次のトークン&
がコマンドであると見なします。
同様の問題を引き起こす可能性のある多くの特殊文字があります: |
>
<
)
&
^
.
特殊文字をリテラルとして処理するようにバッチ パーサーを強制する方法は 2 つあります。1) 引用符で囲むか、2) でエスケープし^
ます。
echo this&echo that
echo "this & that"
echo this ^& that
結果:
this
that
"this & that"
this & that
SET ステートメントでは、割り当て全体が引用符で囲まれているため、リテラルとして適切に扱われます。set 割り当ての後にコマンドを追加することで、それを証明できset texty
ます。texty の現在の値が画面に出力され、それが目的の値であることがわかります。
しかし、値をエコーすると引用符で囲まれなくなるため、パーサーは&
を演算子として扱い、失敗します。
できますがecho "%texty"
、出力に引用符が表示されます。
texty の定義を変更して、エスケープ文字を含めることができます。
set "texty=\Music\TheArchive\Aeph ^& Neonlight\Aeph ^& Neonlight - Space Truckers - 7b - 173.26.mp3"
しかし、それは苦痛です。ありがたいことに、単純な解決策があります。コマンドと演算子が解析された後に変数の遅延展開が発生するため、特殊文字について心配する必要がなくなります。
を使用して使用する前に、遅延拡張を有効にする必要がありますsetlocal enableDelayedExpansion
。次に、パーセントの代わりに感嘆符で変数名を囲みます。
setlocal enableDelayedExpansion
set "texty=\Music\TheArchive\Aeph & Neonlight\Aeph & Neonlight - Space Truckers - 7b - 173.26.mp3"
echo !texty! >>C:\Music\Playlists\baseplaylist.m3u
展開される前に、行がコマンドと演算子について解析されるようになり!texty!
ました。したがって、ECHO は texty のリテラル値を適切に出力します。