使用" for / F"命令在xml文件中查找特定文本并在批处理文件中用作变量

时间:2015-12-23 23:41:55

标签: batch-file

我试图在app.config文件中找到以下版本号。 该文件是XML格式。

文件中的第8行(再次添加行,因为最初从帖子中删除了大/小于符号)

add key =" ReleaseVersion"值=" 5.2.0.2"

我一直在使用各种FOR / F命令,已经关闭了几次。 但是我无法提取5.2.0.2值并将其用作变量 到目前为止在我的剧本中。

此外,当我正在寻找此值5.2.0.2时,将继续更改版本号,因此我不会寻找完全匹配,例如" 5.2.0.2",我希望捕获引号中的内容,例如value ="",然后在我的脚本中将其用作变量。

到目前为止我尝试过的例子......

FOR /f "tokens=3 delims=5." %%a IN ('TYPE appsettings.config ^| FIND "ReleaseVersion"') DO SET do set word3=%%a
FOR /F delims^=^"^ tokens^=2 %%G IN ('FINDSTR /L "ReleaseVersion" "appsettings.config"')
FOR /f "tokens=3 usebackq delims== " %%G in (`appsettings.config`) do @echo %~G

尝试了许多技术,但到目前为止,没有任何成功。 可以根据需要发布更多信息,但这基本上可以解决问题。

4 个答案:

答案 0 :(得分:1)

假设add key="ReleaseVersion" value="5.2.0.2"部分在一行中且相关value参数显示在ReleaseVersion子字符串之后,以下内容可能对您有用:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem define constants:
set "SEARCH=ReleaseVersion"
set "KEYWORD=value"
rem get line of interest and assign it to `LINE`:
for /F "delims=" %%L in ('findstr /L "%SEARCH%" "app.config"') do (
    set "LINE=%%L"
)
setlocal EnableDelayedExpansion
rem cut everything off up to the search string:
set "LINE=!LINE:*%SEARCH%=!"
rem cut everything off up to the keyword:
set "LINE=!LINE:*%KEYWORD%=!"
rem extract the version number:
for /F tokens^=1^ delims^=^"^=^/^<^>^  %%N in ("!LINE!") do (
    set "VNUM=%%N"
)
rem transfer the version number over the `setlocal`/`endlocal` barrier:
endlocal & endlocal & set "VNUM=%VNUM%"
echo ReleaseVersion: %VNUM%
exit /B

感兴趣的字符串部分不需要看起来与上面显示的完全相同,但可能包含更多或更少的空格(例如add key = "ReleaseVersion" value = "5.2.0.2"),或者包含"或不包含add key=ReleaseVersion value=5.2.0.2 }})。唯一的条件是属性key需要出现在属性value之前。

答案 1 :(得分:0)

如果搜索行恰好是这一行:

add key="ReleaseVersion" value="5.2.0.2"

...然后这段代码应该有效:

@echo off
setlocal

for /F "tokens=3" %%a in ('findstr "ReleaseVersion" "appsettings.config"') do set %%a
set "value=%value:~1,-1%"
echo %value%

如果搜索行的布局发生变化(更多空格或其他字符,更少的引号等),那么之前的代码应该需要调整。

答案 2 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q34445384.txt"
FOR /f "tokens=3delims==" %%a IN (
 'findstr /L /c:"add key=\"ReleaseVersion\" value=" "%filename1%"') DO SET "release=%%~a"
ECHO release=%release%

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

我使用了一个名为q34445384.txt的文件,其中包含我的测试数据。

只需使用findstr找到目标字符串,然后使用=的分隔符将环境变量设置为第三个标记,并使用~从值中删除引号。

这假定目标文本的唯一性,并且该行的结构与发布完全一致。

答案 3 :(得分:0)

假设app.config是有效的,格式良好的XML,刮除发布版本的最佳方法是通过XPath查询它。您可以为此调用PowerShell。

@echo off
setlocal

set "psCommand=powershell "^
    select-xml \"//add[@key^='ReleaseVersion']\" app.config ^| %%{ $_.node.value };^
""

for /f %%I in ('%psCommand%') do set "version=%%~I"

echo %version%

这将解析名为&#34的节点的app.config;添加&#34;它有一个名为&#34; key&#34;的属性。其值为&#34; ReleaseVersion&#34;然后将返回该节点&#34; value&#34;属性的价值。 for /f将其捕获到批处理变量中。