用于替换字符串的bat脚本创建空文件
问题描述:
我正在使用此bat文件将web.config中的值从httpTransport修改为httpsTransport。如果我将输出指向另一个文件,效果很好。如果我尝试覆盖我的文件,它会创建一个空文件。用于替换字符串的bat脚本创建空文件
@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%
任何帮助将éapreciated
答
下面的代码的情况下,失败都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 )
这是在性能上,因为有多个文件访问操作(追加到每由于每次循环迭代文件更糟到
>>
),但它可以防止需要临时文件。在被findstr
读取之后,部分> "%OUTTEXTFILE%" rem/
耗尽文件,然后将其附加到稍后的循环体中。
您需要输出到新文件。替换之后,将新文件重命名为原始文件。吻。 – Squashman
是的,发现了,但重命名只是dosen't重命名文件....添加新版本 – TBogdan
我知道为什么...我有我的整个路径在INTEXTFILE,这是错误的,它应该只是“网络。 config“ – TBogdan