Batch file 用于替换字符串的bat脚本将创建空文件
我使用这个bat文件将web.config中的一个值从httpTransport修改为httpsTransport。如果我将输出定向到另一个文件,效果会很好。如果我试图覆盖我的文件,它会创建一个空文件Batch file 用于替换字符串的bat脚本将创建空文件,batch-file,replace,config,Batch File,Replace,Config,我使用这个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_ba
@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%
如果
INTEXTFILE
和OUTTEXTFILE
都指向同一个文件,则以下代码将失败,因为输出重定向
在开始时准备输出文件,因此它会创建一个空文件,然后由findstr
读取:
set“INTEXTFILE=D:\teste\u bat\Web.config”
设置“OUTTEXTFILE=D:\teste\u bat\Web.config”
>%OUTTEXTFILE%(
对于/f“delims=“%%i in('findstr“^”“%INTEXTFILE%”)do(
设置“行=%%i”
延迟扩展
设置“行=!行:%search%=%replace%”
回声(!线!
端部
)
)
用>
替换
也不起作用,因为这会将新数据附加到原始文件中
要克服这一问题,您有两个选择:
set“INTEXTFILE=D:\teste\u bat\Web.config”
设置“OUTTEXTFILE=D:\teste\u bat\WebTemp.config”
>%OUTTEXTFILE%(
对于/f“delims=“%%i in('findstr“^”“%INTEXTFILE%”)do(
设置“行=%%i”
延迟扩展
设置“行=!行:%search%=%replace%”
回声(!线!
端部
)
)
移动/Y“%OUTTEXTFILE%”“%INTEXTFILE%”
由于性能更好,这是推荐的变体set“INTEXTFILE=D:\teste\u bat\Web.config”
设置“OUTTEXTFILE=D:\teste\u bat\Web.config”
对于/f“delims=“%%i in('findstr“^”“%INTEXTFILE%”^&^>“%OUTTEXTFILE%”rem/”)do(
设置“行=%%i”
延迟扩展
设置“行=!行:%search%=%replace%”
>>“%OUTTEXTFILE%”回显(!行!
端部
)
由于存在多个文件访问操作(由于>
的原因,每次循环迭代都会将文件追加到文件中),因此性能更差,但这会阻止对临时文件的需要rem/在被findstr
读取后耗尽文件,然后将其附加到后面的循环体中您需要输出到一个新文件。替换后,只需将新文件重命名为原始文件。K.I.S.S.Yup,发现了,但重命名没有重命名文件…添加了新版本我知道为什么…我的整个路径都在INTEXTFILE中,这是错误的,它应该只为“web.config”当它试图将一个文件重命名为一个已经存在的文件时,您在屏幕上看到了错误。那么,是什么阻止您在重命名新文件之前先使用delete命令删除原始文件。您的另一个选项是使用
MOVE/Y
。