我正在尝试创建一个简单的批处理文件,该文件将用不同的行替换文本文件中的行,但保持文件中的每个其他行都相同。我在互联网上找到了一个脚本,我稍微修改了一下,并提出了以下代码。但是,由于某些原因,此代码不会回应任何以“= 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
再次感谢。
编辑:这将在组织中的数百台计算机上运行,并且使用第三方工具实际上不是一个选项,因为在所有计算机上安装另一个应用程序(即使理论上可能使用我们将使用的远程管理软件)不是期望的。
感谢。
答案 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. >>file
与1>>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