1

我不确定我的旧帐户发生了什么,所以必须创建这个新帐户。我写的批处理文件有问题。我让它在用户输入某些信息的地方工作,然后输入将替换文件中的文本。但是,我遇到的问题似乎无法在此处找到确切的答案或帮助我解决问题是...如何替换引号内的数据?我尝试转义引号,但我不确定它是否找到它,只是没有替换它或什么。这是部分

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" />

我很确定 find 部分可以正常工作,因为我看到您必须转义 dbl 引号..但是替换部分不起作用。我也尝试在替换中使用双引号,但无济于事。

任何帮助,将不胜感激。

4

2 回答 2

1

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

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

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

批处理文件通常不太擅长处理文本文件,尤其是它们在处理 XML 方面很糟糕。你可以做到,但需要大量晦涩难懂的代码,而且速度会很慢。除非您非常聪明,否则任何批处理文件解决方案都可能很脆弱,这意味着有人可能会重新格式化 XML 输入并破坏您的代码。

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

如果您真的想使用批处理脚本,我已经在 DosTips 上发布了“终极”文件搜索和替换批处理实用程序。有关如何使用脚本的文档嵌入在代码中。

另一种选择是混合 JScript/Batch 解决方案:正则表达式搜索和替换批处理 - 轻松编辑文件!,再次发布在 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%"
于 2012-12-05T22:31:06.883 回答
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 .
)
于 2020-09-22T06:36:36.967 回答