递归搜索字符串并替换字符串

search for string recursively and replace the string

我需要在 Windows PATH 中递归地找到一个特定的字符串,并将该字符串替换为另一个字符串:

任务#1

我确定(在帮助下)如何使用以下脚本识别可用字符串的路径。

findstr /s /i /m /c:"topaz3258" H:\MKS\build\host\dev\*.* > H:\topaz3258\result.txt

任务#2

现在我需要您的帮助,以在为字符串标识的所有上述路径中将“topaz3258”更新为“topaz103258”。文件类型为“.ini”和“.cmd”文件。

注意:Powershell在组织中受限,所以我不得不使用Batch script。

使用 powershell 脚本,您可以非常轻松地在文件中进行正则表达式替换。我只是从我已有的东西中举了一个例子,这应该可以正常工作。但这只是做一个文件

(gc "输入文件名" -raw) -replace 'topaz3258', 'topaz103258' | Out-File -编码ASCII "输出文件名"

虽然你可以很容易地遍历文件 https://theitbros.com/powershell-script-for-loop-through-files-and-folders/

编辑,我只是​​徒手写的,但它可能看起来像

$files = Get-ChildItem H:\MKS\build\host\dev\ -Recurse *.*

foreach ($f in $files){

(gc $f.FullName -raw) -replace 'topaz3258', 'topaz103258' | Out-File -encoding ASCII $f.FullName

}

如果您不想这样做 in-place 您可以指定不同的输出路径,或者在操作之前复制文件夹树。取决于你到底需要什么。 star dot star 是一个非常广泛的网络,顺便说一句,您可能只想按文本文件或其他内容进行过滤


如果你没有powershell

我从其他答案中快速将其组合在一起(也进行了编辑)。它不会再创建新文件,而是直接写入原始文件。这很危险,你不能回去。无法撤消,因此请以某种方式进行临时备份。该脚本将保留空行。它不会遵守单词边界,例如

红蓝reddit(红->绿)绿蓝greendit

@echo off
SET FIND_STR=topaz3258
SET REPL_STR=topaz103258
SET ROOT_DIR=H:\MKS\build\host\dev\


for /R "%ROOT_DIR%" %%a in (*.txt) do (
    :: say the filename
    echo %%a

    for /f "delims=" %%i in ('type "%%a" ^| find /v /n "" ^& break ^> "%%a"') do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        set "line=!line:*]=!"
        if defined line set "line=!line:%FIND_STR%=%REPL_STR%!"
        >>"%%a" echo(!line!
        endlocal
    )
)