2013-07-15 63 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! 
) 

这为我工作。文件名和口罩改变,以保护无辜,自然。