5

私の最初の投稿、ほとんどの質問は、ここで提供されたこのフレンドリーな知識を使用してすでに解決されています. しかし、ここでも cmd.exe でのポイズン文字の処理に関する質問で、アイデアが不足しています。

二重引用符で囲まれた特定の文字列変数があると仮定しましょう。ほとんどの有害な文字は、以前に一般的な文字に置き換えられており、残りのスクリプトを妨害するものは「&」、「(」、「)」、および「%」です。文字列は、後で引用符なしでファイルにエコーする必要があります。そこで、毒の文字を 3 倍にして逃れるというアイデアを思いつきました。

@echo off & setlocal ENABLEEXTENSIONS
SET AlbumArtist=%1
CALL :EscapePoisonChars %AlbumArtist% AlbumArtist_VDN

SET "FlacHyperLink==hyperlink^("file://%AlbumArtist_VDN%"^;"LossLess"^)")
echo %FlacHyperLink%
echo %AlbumArtist_VDN%

endlocal &GOTO:EOF

:EscapePoisonChars
@echo off & setlocal ENABLEEXTENSIONS
SET TmpString=%1
SET TmpString=%TmpString:&=^^^&%
SET TmpString=%TmpString:(=^^^(%
SET TmpString=%TmpString:)=^^^)%
endlocal&SET %2=%TmpString:~1,-1%&GOTO :EOF

上記のスクリプトを呼び出すと、パーセント記号がないことを除けば、期待どおりの出力が得られます。

G:\YAET\20130204_Work>TryAmper.bat "100% Rock & Roll (7' UpMix)"
=hyperlink("file://100 Rock & Roll (7' UpMix)";"LossLess")
100 Rock & Roll (7' UpMix)

G:\YAET\20130204_Work>

パーセントはそれ自体でエスケープできることを知っています。したがって、「%%」は通常、単一のリテラル「%」につながります。しかし、cmd は常に変数として解釈し、展開しようとするため、パーセント記号の有効な置換手順を見つけることができませんでした。これは、この問題を処理するための完全に間違った方向ですか、それとも変数展開の誤解ですか? どんなヒントでも大歓迎です!ありがとう!

乾杯、マーティン

編集 独自のコードを削除しました。クリーンなソリューションについては、以下の Jeb の回答を参照してください。

助けてくれてありがとう、マーティン

4

1 に答える 1

6

いい質問です!
最初は、はい、パーセント記号でも置き換えることができますが、パーセント展開内ではできません。ここでは遅延展開が必要です。

Setlocal EnableDelayedExpansion
set tmpstr=!tmpstr:%=%%!

しかし、遅延展開を使用する場合、遅延展開はバッチ パーサーの最後のフェーズであり、すべての文字が特別な意味を失うため、エスケープはもう必要ありません。
遅延展開でエコーするだけです。

Echo !tmpvar!

編集:クリーンソリューション

@echo off
setlocal DisableDelayedExpansion

REM * More or less secure getting the parameter
SET "AlbumArtist=%~1"

setlocal EnableDelayedExpansion
SET "FlacHyperLink==hyperlink("file://!AlbumArtist!";"LossLess")"

echo !FlacHyperLink!
echo !FlacHyperLink!> hugo.txt

から感嘆符を取得するには、最初に disableDelayedExpansion が必要です%1
その後、遅延拡張に切り替えて、どこでも使用する必要があります。

于 2013-02-05T23:36:58.123 に答える