我试图在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
尝试了许多技术,但到目前为止,没有任何成功。 可以根据需要发布更多信息,但这基本上可以解决问题。
答案 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
将其捕获到批处理变量中。