如何替换findstr批处理文件中的双引号

时间:2012-12-05 17:07:26

标签: file batch-file double quotes findstr

我不确定我的旧帐户发生了什么,所以不得不创建这个新帐户。我遇到了我写的批处理文件的问题。我让它在用户输入某些信息的地方工作,然后输入将替换文件中的文本。但是,我遇到的问题似乎无法在这里找到答案或帮助我...你如何在引号内替换数据?我试图逃避报价,我不确定它是否找到它而只是不替换它或什么。这是部分

setlocal DisableDelayedExpansion
(
  for /F "usebackq delims=" %%a in ("%drive%:\bdi\%bdi1%\importer.config") do (
    set "str=%%a"
    setlocal EnableDelayedExpansion
    set "str=!str:""saveTcpMessage"" value=""True""="saveTcpMessage" value="False"!"

    echo(!str!
    endlocal
  )
) > %drive%:\bdi\%bdi1%\newfile.txt
%drive%:
cd "%drive%:\bdi\%bdi1%"
del importer.config
rename newfile.txt importer.config
pause

在上面的示例中,我希望批处理文件在名为importer.config

的文件中查找以下字符串
<add key="saveTcpMessage" value="True" />

如果找到上述值,我希望将其替换为:

<add key="saveTcpMessage" value="False" />

我很确定查找部分工作正常,因为我看到你必须逃避dbl引号..但替换部分不工作。我曾尝试在替换中使用双引号,但无济于事。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

cmd.exe解析器不会像这样转义引号。为了逃避引用,您必须使用^",但这意味着必须转义所有引号,以及所有特殊字符,例如< &等。一旦解析器看到未转义的引号那么引用语义就会发挥作用,直到遇到下一个引用。逃避引用的报价是不可能的。

但是上述所有情况并不重要:您的整个方法无法正常工作,因为无法在变量扩展搜索和替换的搜索部分中包含=。它是困扰批量编程的众多小“gottchas”之一。

如果您可以保证与您的<add key="saveTcpMessage" value="True" />元素在同一行中不存在其他XML元素,那么您可以简单地验证您是否具有正确的行,然后将“False”替换为“True” ”。但很可能你不能做出这样的保证。 XML没有固有的行结构,因此数据可以重新格式化为一个连续的行,它仍然是具有相同含义的有效XML。或者元素可以分成多行。

批处理文件通常不太适合处理文本文件,特别是在使用XML时它们很糟糕。你可以做到这一点,但需要很多神秘的代码才会很慢。除非你非常聪明,否则任何批处理文件解决方案都可能很脆弱,这意味着有人可能会重新格式化XML输入并破坏你的代码。

我建议您使用其他语言或实用程序 - 理想情况下是一个用于处理XML的实用程序。但是VBScript,JScript或PowerShell也可以工作。这些语言至少可以让你轻松地进行文字搜索并替换你正在尝试的文字。

如果确实想要使用批处理脚本,我已在DosTips上发布了The "ultimate" file search and replace batch utility。有关如何使用脚本的文档嵌入在代码中。

另一种选择是混合JScript / Batch解决方案:regex search and replace for batch - Easily edit files!,再次发布在DosTips上。完整文档也嵌入在该代码中。

假设您创建了在第二个链接中找到的REPL.BAT脚本,您可以执行以下操作:

@echo off
setlocal

:: define drive and bdi1 as needed

set "file=%drive%:\bdi\%bdi1%\importer.config"
set "search=<add key="saveTcpMessage" value="True" />"
set "replace=<add key="saveTcpMessage" value="False" />"

type "%file% | repl.bat search replace el >"%file%.new"
move /y "%file%.new" "%file%"

答案 1 :(得分:0)

非常感谢dbenham。我跟一个我工作的程序员交谈过,他说同样的事情......没人想用这个古老的批处理文件!他还提出了其他语言。我将尝试你的链接,看看我想出了什么。谢谢

答案 2 :(得分:0)

“到`

类似这样的东西:

@echo off
set quot=^"
setlocal enabledelayedexpansion
for /f "usebackq skip=1 delims=" %%i in ( `wmic bios get BIOSVersion ^
 ^| findstr /r /v "^$"`) do (
for /f tokens^=*^ delims^=^"  %%a in ("%%i") do set unquoted=%%a
set "unquoted=!unquoted:%quot%=`!"
echo .
echo !unquoted!
echo .
)