我有两个针对 xml 文件的单独查询,当我单独运行它们时,它们工作正常。但是,当我在同一个脚本中运行它们时,第二个查询的输出不正确。
输入文件如下所示:
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<Safex>
<Add>
<User folder="/" name="D2\\[email protected]">
<GroupMembership>ADMINS</GroupMembership>
<GroupMembership>WebService</GroupMembership>
</User>
<User folder="/" name="D2\\[email protected]">
<GroupMembership>WebService</GroupMembership>
</User>
<User folder="/" name="D2\\[email protected]">
<GroupMembership>WebService</GroupMembership>
</User>
<User folder="/" name="D2\\[email protected]">
<GroupMembership>ADMINS</GroupMembership>
</User>
<User folder="/" name="D2\\[email protected]">
<GroupMembership>WebService</GroupMembership>
</User>
</Add>
</Safex>
我的脚本如下:
[xml]$xml = Get-Content $InputPath\test002.xml
$a = $xml.Safex.Add.User | ForEach-Object {
[PSCustomObject]@{
'Name' = $_.name
'Group' = $_.GroupMembership
}
}
$a
$b = $xml.Safex.Add.User | Where-Object { $_.GroupMembership -eq 'WebService' } |
Select-Object @{Name = 'Name'; Expression = {$_.Name}}, GroupMembership
#$b
当我注释掉 $b 时,$a 将返回以下内容:
Name Group
---- -----
D2\\[email protected] {ADMINS, WebService}
D2\\[email protected] WebService
D2\\[email protected] WebService
D2\\[email protected] ADMINS
D2\\[email protected] WebService
当我注释掉 $a 时,$b 将返回以下内容:
Name GroupMembership
---- ---------------
D2\\[email protected] {ADMINS, WebService}
D2\\[email protected] WebService
D2\\[email protected] WebService
D2\\[email protected] WebService
当我取消注释 $a 和 $b 时,我得到以下结果:
Name Group
---- -----
D2\\[email protected] {ADMINS, WebService}
D2\\[email protected] WebService
D2\\[email protected] WebService
D2\\[email protected] ADMINS
D2\\[email protected] WebService
D2\\[email protected]
D2\\[email protected]
D2\\[email protected]
D2\\[email protected]
我似乎无法弄清楚为什么当 $a 和 $b 都被取消注释时,$b 的标题不会出现,并且 GroupMembership 值也不会出现。
感谢您提供的任何帮助。
在两个对象数组(
$a
和)中使用相同的属性名称(相同的标题),则您的代码可以正常工作。否则,您将遇到与PowerShell Export-CSV - Missing Columns$b
中所述的问题类似的问题。根本原因是你的台词
和
在顶级脚本上下文中生成未捕获的输出,从而导致隐式调用以在
Out-Default
控制台上显示输出。然后,这会将两行的整个输出传递到对的单个调用中
Format-Table
,该调用有一个怪癖,即它会等待 300 毫秒以等待更多数据到达,然后再决定显示哪些列。看起来在那 300 毫秒中只接收到了来自的数据$a
,因此它将列锁定为Name
和Group
。当接收到来自的输出时,$b
它不会自动添加该GroupMembership
列。@Santiago Squarzon 的答案通过对齐属性名称来解决这个问题
$a
,$b
因此由其确定的列Format-Table
在整个输出中都是一致的。另一种选择是将各个变量明确地输入到管道中,
Format-Table
如下所示:这将呈现两个单独的表,每个表的列都根据对 的每个单独调用的输入进行计算
format-table
,并在控制台上显示以下内容:请参阅以下链接以获取更多详细的技术细节: