批量替换文件

时间:2017-08-12 22:25:45

标签: powershell batch-file cmd

我需要使用.bat替换文件中的多个不同文本实例。

(注意:SQF只是服务器配置文件,编码不是问题)

我试过了:

powershell -Command "(gc Structures.sqf) -replace 'WOOD_WALL', 'CINDERBLOCK_WALL' | Out-File BrickMe.sqf"

powershell -Command "(gc Structures.sqf) -replace 'e614ee17-4467-4d51-a3f2-d4faa61de89e', 'a59f5b71-2b9a-45a2-85bb-ec29a47f78aa' | Out-File BrickMe.sqf"

powershell -Command "(gc Structures.sqf) -replace 'Wood Wall', 'Cinderblock Wall' | Out-File BrickMe.sqf"

但它只执行最后一个命令。例如。 WOOD_WALL仍然存在。

sed -e "s/WOOD_WALL/CINDERBLOCK_WALL/" -e "s/Wood Wall/Cinderblock Wall/" <Structures.sqf>BrickMe.sqf

只需创建一个名为BrickMe.sqf的空文件

我也试过VBScript无济于事。我宁愿让它能够在任何Windows机器上运行,只要代码可以处理文件大小但我不知道如何替换不同文本的多个实例而不重复整个命令并花费很长时间。

我也看过这个http://www.dostips.com/?t=batch.findandreplace 但不确定在哪里放置我的&#34; WOOD_WALL&#34;实例和我的文件名。

我在google上找到了大量的结果,用于替换多个文件中的1个文本,但几乎没有更换1个文件中的多个文本。

故事:
我正在运行Arma 3服务器并在游戏中构建了一个木制管理基础,我希望将其转换为cinderblock基础。我以前做过这个,但只能通过替换实例名称,Instance_ID和实体名称手动完成。我想尽可能使用批处理文件并将其上传到http://www.exilemod.com以帮助其他管理员。这些文件通常不超过15兆字节。

我对Windows批处理文件非常棒,但我不熟悉PowerShell。

1 个答案:

答案 0 :(得分:3)

难怪你的行为不成功。

您始终采用原始输入文件,执行操作并以相同方式保存到同一输出文件,以覆盖上一个操作。

为了更好地理解分解的PowerShell部分:

(gc Structures.sqf) -replace 'WOOD_WALL', 'CINDERBLOCK_WALL' `
                    -replace 'e614ee17-4467-4d51-a3f2-d4faa61de89e', 
                             'a59f5b71-2b9a-45a2-85bb-ec29a47f78aa' `
                    -replace 'Wood Wall', 'Cinderblock Wall' | 
 Out-File BrickMe.sqf

由于-replace运算符基于RegEx,因此第1和第3个替换可以通过以下方式加入:

  • 中放置一个字符类[_ ]下划线或空格
  • 捕获组([_ ])
  • 使用替换字符串$1
  • 中的捕获组
(gc Structures.sqf) -replace 'WOOD([_ ])WALL', 'CINDERBLOCK$1WALL' `
                    -replace 'e614ee17-4467-4d51-a3f2-d4faa61de89e', 
                             'a59f5b71-2b9a-45a2-85bb-ec29a47f78aa' | 
Out-File BrickMe.sqf

所有这些都再次包裹在cmd行中:

powershell -NoProfile -Command "(gc Structures.sqf) -replace 'WOOD([_ ])WALL', 'CINDERBLOCK$1WALL' -replace 'e614ee17-4467-4d51-a3f2-d4faa61de89e','a59f5b71-2b9a-45a2-85bb-ec29a47f78aa'|Out-File BrickMe.sqf"