我是批处理脚本的新手。
我正在尝试从 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
进一步阅读:
[√]放
[√]为了
[√]对于/F
[√]查找字符串
答案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
循环。