Powershell:多个 Select-Object 语句仅返回第一次出现的结果
Powershell : multiple Select-Object statements returning 1st occurrence results only
我 运行正在 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 相同的参数,那么两者都被正确执行。例如,如果两个 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 语句的结果。
有人知道为什么会这样吗?
这听起来像是一项家庭作业。下面的答案是这样对待的。换句话说,这些应该有助于指出一些问题,但这里的读者不应该为你做功课。
请检查管道变量的正确格式。是 $_ 不是 $
例如,$_.Name Google:PowerShell 管道变量
查看比较运算符的使用。 PowerShell
中没有 .eq 这样的东西
你的 XML 格式不正确,所以我不确定这个脚本是如何通过 $xmlDocument.Load() 的。用于加载文件的语法看起来不错并且您在正确的轨道上加载 属性 值。 XML 格式正确后,您只需使用正确的数据路径即可。
您只需一次阅读XML。
您不需要将管道变量与 select 语句一起使用。只需 属性 名称即可。
例如,Select-Object Name 这将 return Name 的值 属性
我希望这足以让你再次感动。
只需添加此注释即可结束。
不知道管道出了什么问题。同事也遇到过类似的问题。所以我改变了策略。
我通过设置一个新变量深入到 $xmlDocument:
$组 = $xmlDocument.flowController.rootGroup.processGroup
并将代码替换为适当的
foreach ($property in $group.property...){
if ($property.name -eq 'oldValue'){
parameter.value = 'newValue'
}
}
这行得通,并且可以通过更复杂的搜索进一步 elaborated/complicated。
我 运行正在 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 相同的参数,那么两者都被正确执行。例如,如果两个 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 语句的结果。
有人知道为什么会这样吗?
这听起来像是一项家庭作业。下面的答案是这样对待的。换句话说,这些应该有助于指出一些问题,但这里的读者不应该为你做功课。
请检查管道变量的正确格式。是 $_ 不是 $
例如,$_.Name Google:PowerShell 管道变量查看比较运算符的使用。 PowerShell
中没有 .eq 这样的东西你的 XML 格式不正确,所以我不确定这个脚本是如何通过 $xmlDocument.Load() 的。用于加载文件的语法看起来不错并且您在正确的轨道上加载 属性 值。 XML 格式正确后,您只需使用正确的数据路径即可。
您只需一次阅读XML。
您不需要将管道变量与 select 语句一起使用。只需 属性 名称即可。
例如,Select-Object Name 这将 return Name 的值 属性
我希望这足以让你再次感动。
只需添加此注释即可结束。
不知道管道出了什么问题。同事也遇到过类似的问题。所以我改变了策略。
我通过设置一个新变量深入到 $xmlDocument: $组 = $xmlDocument.flowController.rootGroup.processGroup
并将代码替换为适当的
foreach ($property in $group.property...){
if ($property.name -eq 'oldValue'){
parameter.value = 'newValue'
}
}
这行得通,并且可以通过更复杂的搜索进一步 elaborated/complicated。