我在 Windows 8.1 上运行 PowerShell 4.0 版
我有一个名为 flow1.xml 的 xml 文档(来自 nifi 流),如下所示:
<flowController encoding-version="1.3">
<rootGroup>
<id>123</id>
<name>BigTime</name>
<position x="0.0" y= "0.0"/>
<processGroup>
<id>456</id>
<name>SmallTime</name>
<position x="1000.0" y="2000.0"/>
<processGroup>
<id>789</id>
<name>TinyTime</name>
<position x="3000.0" y="4000.0"/>
</processGroup>
<processGroup/>
</rootGroup>
</flowController>
我有一个 powerShell 脚本 test.ps1 如下:
$filePath='flow1.xml'
$xmlDocument = New-Object -TypeName XML
$xmlDocument.Load($filePath)
$xmlDocument.flowController.rootGroup.processGroup |
Where-Object { $_.name -eq 'SmallTime'} |
Select-Object -Property {$_.id}
$xmlDocument.flowController.rootGroup.processGroup.processGroup |
Where-Object { $_.name -eq 'TinyTime'} |
Select-Object -Property {$_.id}
我在 Windows Cmd 框中从 PowerShell 运行;即 PS C\Temp>test.ps 当我运行它时,我得到了预期的输出:
Output:
$_.id
-----
456
789
当我更改第二个 Select_Object 时:
$xmlDocument.flowController.rootGroup.processGroup.processGroup |
Where-Object { $_.name -eq 'TinyTime'} |
Select-Object -Property {$_.name}
我明白了
Output:
$_.id
-----
456
我只$_id
从第一个子句中得到,而不是$_name
从第二个子句中得到。一般情况是 - 如果两个 Select-Object 语句都选择相同的参数,则两者都正确执行。例如,如果两个 Select-Object 语句都是Select-Object -Property {$_.name}
我得到的输出:
Output:
$_.name
-----
SmallTime
TinyTime
如果 Select-Object 语句不同,它似乎只执行第一个语句。我尝试在第二个 Select-Object 之前再次阅读 xmlDocument :
$filePath='flow1.xml'
$xmlDocument = New-Object -TypeName XML
$xmlDocument.Load($filePath)
$xmlDocument.flowController.rootGroup.processGroup |
Where-Object { $_.name -eq 'SmallTime'} |
Select-Object -Property {$_.id}
$xmlDocument = New-Object -TypeName XML
$xmlDocument.Load($filePath)
$xmlDocument.flowController.rootGroup.processGroup.processGroup |
Where-Object { $_.name -eq 'TinyTime'} |
Select-Object -Property {$_.id}
但同样的事情也会发生。我只得到第一个 Select-Object 语句的结果。
有谁知道为什么会这样?