在批处理脚本中,从 XML 中提取字符串

在批处理脚本中,从 XML 中提取字符串

我是批处理脚本的新手。

我正在尝试从 XML 输出中提取状态。基本上,如果它是“已启动”,我需要下面的 appPoolState。

<output>
    <MSDeploy.recycleApp>
        <recycleApp path="Default Web Site" isDest="False" recycleMode="RecycleAppPool" appPool="DefaultAppPool" appPoolState="Started" workerProcesses="0" />
    </MSDeploy.recycleApp>
</output>

根据我的谷歌搜索,我尝试了以下代码。我能够提取状态。

但我认为可以有一个简化版本。或者可能有比这更好的其他方法?

for /F "tokens=2 delims=<>" %%i in ('findstr "appPoolState=" msdeploy.xml') do set FL1=%%i
echo %FL1%

for /f "tokens=8 delims= " %%a in ("%FL1%") do (
  set FL2=%%a
)
echo %FL2%
for /f "tokens=2 delims=\= " %%a in ("%FL2%") do (
  set FL3=%%a
)
echo %FL3%

答案1

如果使用=字符"作为分隔符,则可以在标记 10 中提取所需的字符串:

在命令行中:

for /F tokens^=10delims^=^=^"  %i in ('findstr appPoolState^= msdeploy.xml')do echo\%~i

在 bat/cmd 文件中:

for /F tokens^=10delims^=^=^"  %%i in ('findstr appPoolState^= msdeploy.xml')do echo\%%~i
  • 请理解,这会迫使您处理没有双引号的标记和分隔符,这就是为什么您^=在标记和^=^=^"分隔符中使用一个附加的分隔符^之后tokens^=10和之前:tokens^=10^delims^=^=^"
@echo off 

for /F tokens^=10^delims^=^=^" %%i in ('findstr appPoolState^= msdeploy.xml')do set "_FL1=%%~i"

echo=%_FL1%
  • 输出结果:
Started


  • 要在 PowerShell 中执行相同操作:
$str=Get-Content .\msdeploy.xml | foreach-object  {$_.split('""')[9]} 
$str
  • 或者使用别名:
$str=cat msdeploy.xml | % {$_.split('""')[9]} 
$str
  • 对于一行:
$str=Get-Content .\msdeploy.xml| foreach-object  {$_.split('""')[9]}; $str
  • 对于使用别名的一行:
$str=cat msdeploy.xml|% {$_.split('""')[9]}; $str
  • 输出结果与bat/cmd代码相同。
Started


答案2

因为你列出了在您的标签中,这里是.PS1获取信息的方式。[咧嘴笑]

它能做什么 ...


  • 当准备使用真实数据时,创建一个多行字符串,#region/#endregion用获取字符串的任何方法替换整个块。
  • [xml]使用类型加速器将字符串转换为对象
  • 导航到结果对象以获取所需的属性及其值
  • 屏幕上显示

代码 ...

#region >>> create a multiline string
#    in real life, use your source method
$InString = @'
<output>
    <MSDeploy.recycleApp>
        <recycleApp path="Default Web Site" isDest="False" recycleMode="RecycleAppPool" appPool="DefaultAppPool" appPoolState="Started" workerProcesses="0" />
    </MSDeploy.recycleApp>
</output>
'@
#endregion >>> create a multiline string

$XmlInString = [xml]$InString
$AppPoolState = $XmlInString.output.'MSDeploy.recycleApp'.recycleApp.appPoolState

$AppPoolState
  • 输出 =Started

答案3

要获取特定值,请appPoolState用属性替换(例如workerProcesses

@echo off
====SETLOCAL EnableDelayedExpansion

set "appPoolState="
FOR /F delims^=^ eol^= %%L in ('find "appPoolState=" ^<example.xml') do (
    set "line=%%L"
    set "line=!line:*appPoolState=!"
    FOR %%V in (!line!) do set "appPoolState=%%~V"&goto :escape
)
:escape
echo(!appPoolState!

它使用 *带星号的子字符串并跳转到一个标签以退出FOR循环。

相关内容