2013-02-05 26 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> 

我知道的百分比可以自行逃脫。所以「%%」通常會導致一個單一的文字「%」。但是我不可能找到百分號的替換程序,因爲cmd總是將它解釋爲一個變量並試圖擴展它。這是處理這個問題的完全錯誤的方向,還是誤解變量擴展?任何提示歡迎!謝謝!

乾杯,馬丁

編輯 刪除自己的代碼,請參見下面傑布的答案乾淨的解決方案。

感謝您的幫助,馬丁

回答

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報復驚歎號。
之後,您應該切換到延遲擴展,並在任何地方使用它。

+0

傑布,我希望你會回答我看到了[鏈接](http://ss64.org/viewtopic.php?pid=4919#p4919)與你難以置信的黑客我還是不完全理解後。最後你的建議解決了我的問題與毒藥字符。我基於你的解決方案添加了一個簡短的代碼片段,因爲我想使用代碼塊格式。非常感謝! Martin – CmdQuestion

+0

Aarrg - 你做了什麼?我添加了一個_clean_解決方案 – jeb

+0

Jeb,如果你對我的工作不滿意,很抱歉。使用代碼我沒有遇到任何字符組合的問題,所以我認爲在這裏展示結果會很好。我跳過它,現在只是提到你的解決方案。馬丁 – CmdQuestion