我有以下批处理脚本来读取xml文件并找到一个单词(在这种情况下,“ factory ”):< / p>
@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%a in ('findstr /C:"factory" xcsconfig.xml') do set content=%%a
set content=%content:*"=%
set content=%content:~0,-1%
echo %content%
exit /b
以下是 xml 文件的一部分:
<loggers>
<recorder1>
<add name="factory" value="xlog"/>
<add name="alias" value="WSEnterprise.log"/>
</recorder1>
<recorder2>
<add name="factory" value="weblog"/>
</recorder2>
</loggers>
代码工作正常,将始终返回“第一个”创始人 - value =“weblog”/ 。我的问题是,有没有办法在特定标签下返回创始人? (即我想在 recorder1 而不是 record2 标签下进行搜索,并返回答案 value =“xlog”/ )。提前谢谢。
编辑:我改变了我的预期答案,这是不正确的答案 0 :(得分:4)
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sectionstart=recorder1"
SET "insection="
for /f "delims=" %%a in ('type q25062317.txt') do (
IF DEFINED insection (
ECHO "%%a"|FINDSTR /c:"factory" >NUL
IF NOT errorlevel 1 SET "content=%%a"
)
ECHO "%%a"|FINDSTR /i /L /c:"<%sectionstart%>" > NUL
IF NOT ERRORLEVEL 1 SET insection=Y
ECHO "%%a"|FINDSTR /i /L /c:"</%sectionstart%>" > NUL
IF NOT ERRORLEVEL 1 SET "insection="
)
set content=!content:*"=!
set content=!content:*"=!
set content=!content:~1,-1!
echo %content%
GOTO :EOF
我使用了一个名为q25062317.txt
的文件,其中包含我的测试数据。
答案 1 :(得分:1)
您还可以在do
周期的for
块中合并下一个语句。我的意思是:
setlocal EnableDelayedExpansion
for / f“delims =”%% a in('findstr / C:“factory”xcsconfig.xml')do(
设置内容= %% a
set content =!content:*“=!
set content =!content:~0,-1!
echo!content!
)
通过这种方式,输出不仅是最后一个XML代码行,而且还包含所考虑文件中包含“factory”字符串的所有代码行。当然,这个例子不会只回显一个所需的字符串,但这可能会为循环的输出设置一个条件。
答案 2 :(得分:0)
这是一个可以帮助您的强大工具 - 命令看起来像这样可以获得您需要的行,它可以包含在for /f
循环中。
type file.xml |findrepl "<recorder1>" /e:"</recorder1>" /b:"factory"
这使用名为findrepl.bat
的助手批处理文件(由aacini提供) - 从以下网址下载:https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
将findrepl.bat
放在与批处理文件相同的文件夹中或路径上。