2013-08-02 63 views
1

我需要更換的幾個字符所有出現的參數傳遞給批處理文件:在子批處理文件替換多個字符

helper.bat

@echo off 

echo %1 
call:replace_newline_characters_and_additional_quotes arg %%1 
echo %arg% 
goto:eof 

:replace_newline_characters_and_additional_quotes 
set in=%2 
set tmp=%in:\n=|% 
set %1=%tmp:""=\"% 
goto:eof 

運行它

幫手「1」「2 \ n3」

輸出

「1」 「2 \ N3」
「3」,」不被識別爲一個內部或外部命令,可操作的程序或批處理文件

我到底做錯了什麼?

+0

的解決方案你想達到什麼目的?刪除所有引號並用'|'替換換行符? – SmokeyPHP

+0

@SmokeyPHP用\替換所有的「」,並用| – FrozenHeart

+0

替換所有的\ n,所以你希望輸出爲:'「1 \」2 | 3「'? – SmokeyPHP

回答

2
set str=%1 

set str=%str:""=\"% 
set str=%str:\n=^|% 

echo %str:|=^|% 

pause 

剛剛在你的測試用例中爲我工作。

你得到,因爲管|字符的"3"" is not recognized錯誤,因爲它意味着CMD試圖在|前的文字傳遞給它後的「綱要」,這就是爲什麼你會看到我用^|以「逃離」管道並阻止它具有特殊含義

+0

非常感謝,夥計! – FrozenHeart

3

您應該切換到延遲擴展,因爲使用特殊字符是安全的。

setlocal EnableDelayedExpansion 

set "param1=%1" 
echo !param1! 
call :replace_newline_characters_and_additional_quotes arg param1 
echo !arg! 
exit /b 

:replace_newline_characters_and_additional_quotes 
set "in=!%2!" 
set "tmp=!in:\n=|!" 
set "%1=!tmp:""=\"!" 
exit /b 

唯一有問題的線是set "param1=%1",因爲它會在調用

helper "&"^& 

的情況下失敗,這並不容易,以避免這種情況,但存在於
SO: Get list of passed arguments in Windows batch script

+0

非常感謝,夥計! – FrozenHeart