2013-07-15 95 views
2

我在腳本中有一個問題:.bat文件無法逃脫字符

@echo on 
setlocal EnableDelayedExpansion 
pushd C:\Users\Oskars.Abuhovs\Desktop\testJstoReplace 
for /f "delims=" %%a in ('dir /b /a-d-h-s') do (
    set newFile=C:\Users\Oskars.Abuhovs\Desktop\tempjs\%%a 
    if exist !newfile! del /f /q !newfile! 
    for /f "delims=" %%L in (%%a) do (
    set newLine=%%L 
    echo !^newLine:dojo/i18n=ggggggggg^^!dddd! >> !newFile! 
) 
) 
popd 
pause 

的問題是在一排:

echo !^newLine:dojo/i18n=ggggggggg^^!dddd! >> !newFile! 

凡性格!沒有逃脫,我讀到setlocal EnableDelayedExpansion!字符應該使用^^轉義,但不會發生。我如何逃避這個角色?

編輯:

我要替換文件字符串的一部分。這個特定的字符串dojo/i18n應該被替換爲另一個字符串,它包含!例如dojo/i18n!mycomputer

整個腳本一起從文件夾中讀取文件,然後通過搜索這個字符串的行搜索每個文件行:dojo/i18n,當它被發現時,字符串應該替換早期提到的文本dojo/i18n!mycomputer,它包含!我試圖逃跑!有兩個^^的字符,因爲它應該在setlocal EnableDelayedExpansion時工作,但是這個組合:^^!在這一行不起作用,但當我嘗試簡單echo ^^!它的工作。

所以我問如何逃生!該行中的字符?

在此先感謝!

+0

應該怎樣做線?你想替換部分字符串,什麼是'dddd!'?請解釋更多。 – Endoro

+0

@Oskars Abuhovs當變量被'!'本身擴展時,在搜索和替換字符串中都不能使用'!'。在百分比擴展中使用'%'時也是如此。 – jeb

+0

@jeb感謝您的回覆,我會在腦海中記住這一點。 –

回答

0

感謝您的回答,但最終我決定切換到.vbs來解決我的問題。

使用此代碼,如果有人後者需要它:

Const ForReading = 1  
Const ForWriting = 2 

strFilePath = Wscript.Arguments(0) 
strOldText = Wscript.Arguments(1) 
strNewText = Wscript.Arguments(2) 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFolder = objFSO.GetFolder(strFilePath) 
Wscript.Echo objFolder.Path 
Set colFiles = objFolder.Files 
For Each testFile in colFiles 
    FileToReplace = strFilePath + testFile.Name 
    Wscript.Echo FileToReplace 
    Set objFile = objFSO.OpenTextFile(FileToReplace, ForReading) 
    strText = objFile.ReadAll 
    objFile.Close 

If InStr(strText, strOldText) Then 
    strText = Replace(strText, strOldText, strNewText) 
    Set objFile = objFSO.OpenTextFile(FileToReplace, ForWriting) 
    objFile.Write strText 'WriteLine adds extra CR/LF 
    objFile.Close 
End If 
    strText = "" 
Next 
2

這可能會爲你工作:

@echo off 
setlocal EnableDelayedExpansion 
pushd "C:\Users\Oskars.Abuhovs\Desktop\testJstoReplace" 
for /f "delims=" %%a in ('dir /b /a-d-h-s') do (
    set "newFile=C:\Users\Oskars.Abuhovs\Desktop\tempjs\%%~a" 
    if exist "!newfile!" del /f /q "!newfile!" 
    for /f "delims=" %%L in ("%%~a") do call:doline "%%~L" "!newfile!" 
) 
popd 
PAUSE 
goto:eof 

:doline 
SETLOCAL DISABLEDELAYEDEXPANSION 
set "newLine=%~1" 
echo %newLine:dojo/i18n=ggggggggg!dddd% >> "%~2" 
ENDLOCAL 
goto:eof 
0

您可以重寫代碼,以避免延遲擴展的需要:

@echo on 
pushd C:\Users\Oskars.Abuhovs\Desktop\testJstoReplace 
set newFile=C:\Users\Oskars.Abuhovs\Desktop\tempjs 
for /f "delims=" %%a in ('dir /b /a-d-h-s') do (
    if exist "%newfile%\%%a" del /f /q "%newfile%\%%a" 
    for /f "delims=" %%L in ('type "%%a" ') do (
    >>"%newfile%\%%a" echo %%L:dojo/i18n=ggggggggg!dddd 
) 
) 
popd 
pause 
0
@echo off 
setlocal ENABLEDELAYEDEXPANSION 
SET dddd=replacement^^!data 
for /f "delims=" %%a in ('dir /b /a-d-h-s *.doj') do (
    set newFile=u:\temp\%%a 
    if exist !newfile! del /f /q !newfile! 
    (
    for /f "delims=" %%L in (%%a) do (
    set newLine=%%L 
    FOR /f "tokens=1*delims==" %%Q IN ('set dddd') DO (
    SETLOCAL disabledelayedexpansion 
    CALL echo %%newLine:dojo/i18n=ggggggggg%%R%% 
    endlocal 
    ) 
) 
)>>!newfile! 
) 

這爲我工作。文件名和口罩改變,以保護無辜,自然。