如何使用批处理脚本查找和替换文件中的文本

时间:2017-01-31 13:57:52

标签: batch-file dynamic path

我有一个名为client.props的现有文件,我需要创建一个批处理脚本来阅读文档并查找root=并将其替换为root=path_of_file。我使用了下面提到的脚本:

@echo off 
setlocal enableextensions disabledelayedexpansion
set "search=root="
set "replace=root=%~dp0"
set "textFile=client.props"
set "textFile1=client1.props"

for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile1%" ') do 
(
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%search%=%replace%!"
    >>"%textFile1%" echo(!line!
    endlocal
)

我在批处理脚本中的表现不是很好,请帮我解决这个问题。如果文件在F:\temp\file\client.props中可用且其中一行开头为root=,则批处理应将其修改为root=F:\temp\file

在:

root=

后:

root=F:\temp\file

1 个答案:

答案 0 :(得分:0)

=符号不能在子字符串替换语法!line:%search%=%replace%!中使用,因为=将搜索字符串和替换字符串分开。

您可以更改for /F循环,使其分割=字符的每一行,并检查左侧部分是否为root而右侧是否为空:

@echo off 
setlocal enableextensions disabledelayedexpansion
set "search=root="
set "replace=root=%~dp0"
set "textFile=client.props"
set "textFile1=client1.props"

for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile1%" ') do (
    >>"%textFile1%" (
        for /f "tokens=1,* delims==" %%a in ("%%i") do (
            if /i "%%a="=="%search%" (
                if "%%b"=="" (
                    echo(%replace%
                ) else (
                    echo(%%i
                )
            ) else (
                echo(%%i
            )
        )
    )
)

正如您所看到的,甚至没有必要延迟扩展。但是,如果存在类似=root==的行,则此方法会失败,因为前导分隔符将被忽略,后续分隔符将被视为一个分隔符。要进行区分大小写的搜索字符串比较,请从/i命令行中删除if选项。

请注意,替换后的行以\终止,例如root=F:\temp\file\