2

Bat ファイルでこのテキストを取得\Music\TheArchive\Aeph & Neonlight\Aeph & Neonlight - Space Truckers - 7b - 173.26.mp3し、既存のテキスト ファイルの新しい行に書き込むようにしたいbaseplaylist.m3u

これまでのところ、私はこれを持っています:

set "texty=\Music\TheArchive\Aeph & Neonlight\Aeph & Neonlight - Space Truckers - 7b - 173.26.mp3"
echo %texty% >>C:\Music\Playlists\baseplaylist.m3u

しかし、それは機能しません。コピーしようとしているテキストの文字が原因であることはわかっていますが、これを克服する方法がわかりません。

4

2 に答える 2

3

バックスラッシュはあなたの問題とは何の関係もありません。変数の割り当てにも問題はありません。:-)

問題は&文字です。同じ入力行で複数のコマンドを実行できるのは、複合コマンド演算子です。をリテラルにしたいのですが、&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 のリテラル値を適切に出力します。

于 2012-12-08T17:10:11.317 に答える
0

問題は演算子&です。その場合、変数を展開するか、演算子をエスケープするか、「エコー」文字列を別の二重引用符で囲む必要があります...しかし、あなたの場合の解決策はとても簡単です:

set "texty=\Music\TheArchive\Aeph & Neonlight\Aeph & Neonlight - Space Truckers - 7b - 173.26.mp3"
<nul Set /P "string=%TEXTY%" >>C:\Music\Playlists\baseplaylist.m3u

PS : SETLOCAL ENABLEDELAYEDEXPANSIONを使用するのは、ファイル名で遊んでいる場合 (特に文字が含まれている場合) は悪い習慣ですしたがって、展開を使用しないようにしてください。ほとんどのことを行う方法ですが、唯一の方法ではありません。

これがお役に立てば幸いです。

于 2012-12-08T20:50:00.867 に答える