使用批处理文件在文本文件中查找和替换

时间:2010-08-04 19:08:27

标签: batch-file

我正在尝试创建一个简单的批处理文件,该文件将用不同的行替换文本文件中的行,但保持文件中的每个其他行都相同。我在互联网上找到了一个脚本,我稍微修改了一下,并提出了以下代码。但是,由于某些原因,此代码不会回应任何以“= 0”结尾的行到新文本文件,而是将它们回显到屏幕(即使回显关闭)。有没有人有任何建议?

非常感谢。

@echo off
if exist prod.ini del new_prod.ini
for /f "tokens=*" %%a in (prod.ini) do call :AddText "%%a"
del prod.ini
rename new_prod.ini prod.ini
exit /b

:AddText %1
@echo on
echo %1
@echo off
set Text=%~1%
if "%Text%"=="server=server-2.domain.com" (
echo server=server-3.domain.com>> new_prod.ini
) else (
echo %~1%>> new_prod.ini
)
exit /b

原始文件有一些类似于后面的行,但是脚本之后的新文件遗漏了这些行。该脚本与替换时的预期完全一样,以及20个左右的其他行。只有看起来如下的行会引起问题。

_sflag=0
debug_lvl=0
sel_test_lvl=0
ipc_error_logging_lvl=0
ipc_client_debug_lvl=0
ipc_server_debug_lvl=0

再次感谢。

编辑:这将在组织中的数百台计算机上运行,​​并且使用第三方工具实际上不是一个选项,因为在所有计算机上安装另一个应用程序(即使理论上可能使用我们将使用的远程管理软件)不是期望的。

感谢。

3 个答案:

答案 0 :(得分:2)

如何使用命令行工具执行相同的操作,而不是尝试使用脚本命令进行搜索和替换?它更容易,更快(也很有效),你也可以编写脚本。 Google has a ton of them,例如SSR

答案 1 :(得分:1)

原始脚本的问题是这一行

echo.%~1>> new_prod.ini

以下是在扩展其中一个问题行后该行的样子

echo._sflag=0>> new_prod.ini

0>> new_prod.ini会将标准输入重定向到new_prod.ini,而不是重定向标准输出,因为0是标准输入的符号。当然不是你想要的。请注意,标准输出为1,标准误差为2. >>file1>>file相同。

通过将重定向放在行的开头,可以很容易地解决原始代码的问题。

>>new_prod.ini echo.%~1

原始代码还存在其他潜在问题。使用Windows批处理来处理文件确实很麻烦且很慢。如果您有权使用第三方工具,则首选第三方工具。

无论如何,有时需要纯粹的批量解决方案。

对于强大的不区分大小写的搜索和替换,请参阅https://stackoverflow.com/a/8591185/1012053

对于强大的区分大小写的搜索和替换,请参阅http://www.dostips.com/forum/viewtopic.php?f=3&t=2710

答案 2 :(得分:0)

您的%~1%无需最终%

@echo off
if exist prod.ini del new_prod.ini
for /f "tokens=*" %%a in (prod.ini) do call :AddText "%%a"
del prod.ini
rename new_prod.ini prod.ini
exit /b

:AddText
@echo on
echo.%1
@echo off
set Text=%~1
if "%Text%"=="server=server-2.domain.com" (
  echo.server=server-3.domain.com>> new_prod.ini
) else (
  echo.%~1>> new_prod.ini
)
exit /b