Powershell foreach对象如果返回,则返回所有值
我有一个奇怪的输出正在生成$abc是一种大约有200个节点的xml 我试图搜索一个主机名为cat01.pdx30的特定元素,但下面的内容似乎打印出了abc的所有主机名,有什么想法吗Powershell foreach对象如果返回,则返回所有值,powershell,foreach,Powershell,Foreach,我有一个奇怪的输出正在生成$abc是一种大约有200个节点的xml 我试图搜索一个主机名为cat01.pdx30的特定元素,但下面的内容似乎打印出了abc的所有主机名,有什么想法吗 ($abc.DeviceMetaData) | ForEach-Object { if ($PSItem.Device.HostName -match [regex]::Escape("cat01.pdx30")) { return $psitem.Device.HostName
($abc.DeviceMetaData) | ForEach-Object {
if ($PSItem.Device.HostName -match [regex]::Escape("cat01.pdx30")) {
return $psitem.Device.HostName
}
}
$abc看起来像这样:
<?xml version="1.0"?>
<DeviceMetaData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Device HostName="cat02.pdx30">
<Property Name="Home">Region</Property>
</Device>
<Device HostName="cat01.mwh01">
<Property Name="AclFile" />
<Property Name="AnchorPresent">False</Property>
<Property Name="CloudType">Public</Property>
<Property Name="ConfigTemplateFile">iper_Ce.xml</Property>
<Property Name="DcCode">mwh01</Property>
</Device>
<Device HostName="ALB70-RME71-226-01OSP">
<Property Name="OpticalEnabled">True</Property>
</Device>
</DeviceMetaData>
区域
假的
公开的
iper_Ce.xml
mwh01
真的
根据数据样本,您没有指示powershell处理DeviceMetaData元素的子元素
$abc.DeviceMetaData.Device | ForEach-Object {
if($_.HostName -match [regex]::Escape("cat01.pdx30")) {
$PSItem.Hostname
}
}
上面的示例告诉PowerShell遍历所有设备元素。对于这些对象中的每一个,它都将与HostName属性匹配,如果存在匹配,它只输出HostName
请考虑不要在PuthS壳中使用<强>返回< /强>关键字。return关键字从当前范围中断执行,这与仅仅输出一些数据完全不同
请注意,您的示例数据和您的搜索条件不同。在您的数据中没有任何“cat01.pdx30”主机名。这样你就不会觉得解决方案不管用了 更新 基于新的需求,本示例实现了预期的功能$abc.DeviceMetaData.Device | ForEach-Object {
if($_.HostName -match [regex]::Escape("cat01.mwh01")) {
$PSItem.Property | Where-Object Name -eq "DcCode" | Select-Object "#text"
}
}
在新示例中,我们遍历所有属性元素,使用Where对象对其进行过滤,并选择属性的内部文本,该文本带有神奇的“#text”,指示powershell读取属性的值,而不是具有名称和值的属性。其他方法,使用XPath:
[xml] $xml=get-content "C:\temp\test.xml"
$xml.SelectNodes('//DeviceMetaData/Device[@HostName="cat01.mwh01"]/Property[@Name="DcCode"]')."#text"
您能否共享XML文件的一个片段,让我们了解它的结构?请编辑您的问题,并提供示例数据,以便其他人查看必要的详细信息,以帮助您解决问题。根据您所描述的内容,现在在主线程上更新,您似乎正在尝试查找具有属性值的节点。请考虑一下这个问题:实际上我的目的是找到一个特定的设备,比如“CAT01。PDX30”,并返回DCCODE值。这就是我传递$abc.DeviceMetadata的原因。您看到我在更新中共享的新示例了吗?