2013-04-11 84 views
3

我正在嘗試將簡單的批量雙引號替換爲單引號。 測試字符串必須包含特殊字符,最多爲:"<LF>" 我無法替換那裏的雙引號,因爲批次只存在於Syntaxerror。你知道爲什麼,或者如何克服這個?用特殊字符不能正常工作的批量替換

SET TEST="<LF>","<HT>" 
SET modified=%TEST:"='% <-- Syntaxerror 
ECHO %modified% 

回答

2

使用延遲擴張解釋爲輸入/輸出管道:

setlocal enabledelayedexpansion 
SET TEST="<LF>","<HT>" 
SET modified=!TEST:"='! <-- Syntaxerror 
ECHO !modified! 

由於Mr Fuzzy Button注意到,pro瑕疵是shell將<>解釋爲重定向。延遲擴展(使用!而不是%)在解析後擴展變量,因此不影響重定向。

您可以放入引號內的說法解決SET無延遲擴展:

SET "modified=!TEST:"='!" 

但是,ECHO仍然是有問題的,然後。

+0

這很好,可能是最好的,因爲我只需對現有文件進行微小的修改即可。 – membersound 2013-04-11 09:14:30

+0

所以我正確的我總是必須使用'!modified!'而不是'%modified%''無論使用哪個變量?或者我可以以某種方式將它「轉換」回變量,該變量可以再次與'%'一起使用,以便我不必更改其他代碼? – membersound 2013-04-11 09:20:40

+0

是的,它必須是啓用延遲擴展(即從'setlocal'直到匹配的'endlocal'或執行結束時)。否則,你只會得到'!modified!'而不是值。它仍然是一個正常的變量。唯一改變的是它擴展到它的價值時的語義。延遲擴展更類似於其他編程語言中變量的工作方式。如果你使用'%modified%',它會起作用,但只要你有'<' or '>'這樣的東西就會搞砸了,除非你引用正確。 'echo'不能被引用。 – Joey 2013-04-11 09:38:15

0

這對我的作品......

SET TEST="LF","HT" 
echo %TEST% 
SET modified=%TEST:"='% 
ECHO %modified% 

問題就出在你的< S和> S是在Echo

+0

你讓我錯了。 teststring是一個我想要替換的固定(!)字符串。我無法更改測試字符串,因此無法刪除< >字符。 – membersound 2013-04-11 09:04:36

1

雖然延遲擴展是一件好事,但沒有必要回答這個問題。有時候setlocal不可用。我遇到了一個。

在windows shell中,引號的字符串匹配適用於最外面的匹配對(大多數情況下,但不是全部),而不是最內層。

SET TEST="<LF>","<HT>" 
echo %TEST% 
SET "modified=%TEST:"='%" 
echo.|set /p "___=%modified%" 

解決方法:如果echo無法打印某些內容,請設置can。去搞清楚。

+1

我喜歡你的答案,但你需要逃避你想要替換的字符,以便正確打印字符串:'set modified =!TEST:^&= ^^^&!'。雖然我試圖使用&符號轉義 – 2017-01-22 02:34:53