2013-02-05 21 views
5

私の最初の投稿、ほとんどの質問はここでこの親切な知識を使って解決済みです。しかし今、私は、cmd.exeで毒物文字を扱うことについての質問をもう一度持っています。与えられた変数のエスケープ・パーセント記号

与えられた文字列変数が二重引用符で囲まれているとします。ほとんどの毒物文字は既に共通の文字に置き換えられています。スクリプトを妨害する左の文字は "&"、 "("、 ")"、 "%"です。文字列は後で引用符なしでファイルにエコーする必要があります。だから私は毒の文字をエスケープする考えは三倍にしていた:私は上記の私のスクリプトを呼び出すとき

@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> 

私が知っているパーセントというそれ自身でエスケープすることができます。したがって、 "%%"は通常、1つのリテラル "%"につながります。しかし、cmdは常に変数として解釈して展開しようとしているので、パーセント記号の作業置換プロシージャを見つけることはできませんでした。これは、この問題を処理するための完全な間違った方向ですか、あるいは可変展開の誤解ですか?どんなヒントも歓迎!ありがとう!

乾杯、マーティン

編集 はきれいな解決のためのジェブの答え下記参照、独自のコードを削除しました。

マーティン

答えて

6

ニースの質問!
最初は、パーセント記号を置き換えることはできますが、パーセント拡張内ではできません。ここでは遅延拡張が必要です。あなたが遅れた拡張を使用する場合は遅れ拡張は、バッチパーサの最後の段階で、すべての文字が特別な意味を失うよう

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

しかし、あなたは、もはやエスケープを必要としません。
遅延拡張でエコーする必要があります。

Echo !tmpvar! 

EDIT:クリーンソリューション

@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からでも感嘆符を取得する必要があります。
その後、遅延拡張に切り替えて、どこでも使用する必要があります。

+0

Jeb、私は[リンク](http://ss64.org/viewtopic.php?pid=4919#p4919)をあなたの信じられないほどのハックで見た後にあなたが答えてくれることを願っています。最後に上記の提案は私の問題を毒物文字で解決しました。私はコードブロックフォーマットを使用したいので、私の質問にあなたのソリューションに基づいて短いコードスニペットを追加しました。どうもありがとう! Martin – CmdQuestion

+0

Aarrg - どうしたの? _clean_解決策を追加しました – jeb

+0

Jeb、ご迷惑をおかけして申し訳ありません。コードを使用すると、文字の組み合わせに問題は発生しませんでしたので、ここに結果を表示することが十分に役立つと思いました。私はそれをスキップし、ちょうど今あなたのソリューションを参照しました。 Martin – CmdQuestion

関連する問題