用于替换字符串的 bat 脚本创建空文件

bat script for replacing strings creates empty file

我正在使用此 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%

如有帮助,我们将不胜感激

以下代码在INTEXTFILEOUTTEXTFILE指向同一个文件的情况下失败,因为输出重定向>在开头准备输出文件,所以它创建了一个空文件,然后由 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
    )
)

>> 替换 > 也不起作用,因为这会将新数据附加到原始文件。


要克服这个问题,您有两个选择:

  1. 要写入不同的文件并在末尾用新文件替换原始文件:

    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%"
    

    由于性能更好,这是推荐的变体。

  2. 要确保在应用输出重定向之前读取文件

    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 读取 后耗尽文件 ,然后将其附加到循环体的后面。