如何使用批处理文件递归替换文件中的字符串?

如何使用批处理文件递归替换文件中的字符串?

在我的 SQL 文件中,我已将C:\目录硬编码到所有输出文件路径中,但有时客户端希望将输出存储在上E:\,例如。

我该如何仅使用批处理来执行此操作?我考虑过使用 PowerShell,但它未在客户端计算机上启用。

我想要做的事情:

  1. 递归遍历所有目录。
  2. 在每个目录中,查找C:\并替换为E:\

答案1

真恶心,盲目地对整个目录树结构进行大规模替换会让我感到紧张。但如果你认为这是安全的……

使用纯批处理执行您想要的操作可能比较棘手,具体取决于您的文件内容。但使用我编写的名为 REPL.BAT 的混合 JScript/批处理实用程序可以轻松完成。该实用程序在 stdin 上执行正则表达式搜索和替换,并将结果写入 stdout。它是纯脚本,可​​在 XP 及以后的任何现代 Windows 机器上运行,因此不需要安装任何第三方.exe文件。REPL.BAT 实用程序和文档可在此处获得。

假设您当前目录中有 REPL.BAT,或者更好的是,在您的 PATH 中的某个地方,那么以下简单的单行命令应该可以直接从命令行完成此操作,无需批处理。

for /r %F in (*.sql) do @(type "%F"|repl "C:\" "E:\" >"%F.new"&move /y "%F.new" "%F" L >nul)

您可以通过添加开关使搜索不区分大小写I

for /r %F in (*.sql) do @(type "%F"|repl "C:\" "E:\" I >"%F.new"&move /y "%F.new" "%F" L >nul)

或者如果你更喜欢批处理脚本(带I开关)

@echo off
for /r %%F in (*.sql) do (
  type "%%F"|repl "C:\" "E:\" LI >"%%F.new"
  move /y "%%F.new" "%%F" >nul
)

L从头到尾都使用文字开关;另一种选择是转义\

repl "C:\\" "E:\\" I

相关内容