我使用此bat文件将web.config中的值从httpTransport修改为httpsTransport。如果我将输出定向到另一个文件,它的效果很好。如果我尝试覆盖我的文件,它会创建一个空文件。
@echo off &setlocal
set "search=httpsTransport"
set "replace=http123Transport"
set INTEXTFILE=D:\teste_bat\Web.config
set OUTTEXTFILE=D:\teste_bat\WebTemp.config
(for /f "delims=" %%i in ('findstr "^" "%INTEXTFILE%"') do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
echo(!line!
endlocal
))>>"%OUTTEXTFILE%"
del %INTEXTFILE%
rename %OUTTEXTFILE% %INTEXTFILE%
任何帮助都会被贬低
答案 0 :(得分:1)
以下代码在INTEXTFILE
和OUTTEXTFILE
指向同一文件的情况下失败,因为输出重定向>
在开头准备输出文件,因此它创建一个空文件,然后由findstr
读取:
set "INTEXTFILE=D:\teste_bat\Web.config"
set "OUTTEXTFILE=D:\teste_bat\Web.config"
> "%OUTTEXTFILE%" (
for /f "delims=" %%i in ('findstr "^" "%INTEXTFILE%"') do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
echo(!line!
endlocal
)
)
>
替换>>
也不起作用,因为这会将新数据附加到原始文件中。
为了克服这个问题,你有两个选择:
要写入其他文件并在最后用新文件替换原始文件:
set "INTEXTFILE=D:\teste_bat\Web.config"
set "OUTTEXTFILE=D:\teste_bat\WebTemp.config"
> "%OUTTEXTFILE%" (
for /f "delims=" %%i in ('findstr "^" "%INTEXTFILE%"') do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
echo(!line!
endlocal
)
)
move /Y "%OUTTEXTFILE%" "%INTEXTFILE%"
由于性能更佳,这是推荐的变体。
要确保在之前读取文件,应用输出重定向:
set "INTEXTFILE=D:\teste_bat\Web.config"
set "OUTTEXTFILE=D:\teste_bat\Web.config"
for /f "delims=" %%i in ('findstr "^" "%INTEXTFILE%" ^& ^> "%OUTTEXTFILE%" rem/') do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
>> "%OUTTEXTFILE%" echo(!line!
endlocal
)
由于存在多个文件访问操作(由于>>
每次循环迭代附加到文件),因此性能更差,但它可以防止需要临时文件。部分> "%OUTTEXTFILE%" rem/
在findstr
读取之后耗尽文件,然后将其附加到循环体中的后面。