Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell foreach对象如果返回,则返回所有值_Powershell_Foreach - Fatal编程技术网

Powershell foreach对象如果返回,则返回所有值

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是一种大约有200个节点的xml 我试图搜索一个主机名为cat01.pdx30的特定元素,但下面的内容似乎打印出了abc的所有主机名,有什么想法吗

($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的原因。您看到我在更新中共享的新示例了吗?