Powershell管道,其行为不符合预期

时间:2015-11-19 19:50:47

标签: powershell

当我使用filter在哪里使用管道命令排除对象时,它没有给我正确的输出。

PS C:\Users\Administrator> $proall = Get-ADComputer -filter * | ? {$_.name -ne "adfs"} | select @{l='Computername';e={$_
.name}} | ps | select machinename,processname,id | sort id | ft -au

MachineName ProcessName                             Id
----------- -----------                             --
DC          Idle                                     0
DC          Idle                                     0
DC          Idle                                     0
DC          System                                   4
DC          System                                   4
DC          System                                   4
DC          mmc                                     96
DC          mmc                                     96
DC          mmc                                     96
DC          smss                                   276
DC          smss                                   276
DC          smss                                   276
DC          svchost                                304
DC          svchost                                304
DC          svchost                                304

所以这里没有。我们看到的流程不仅仅是实际的流程。机器上的进程。但是,没有来自其他机器的特定进程(交换和共享点)。

要检查我的命令,我已确保以下输出符合预期。

PS C:\Users\Administrator> Get-ADComputer -filter * | ? {$_.name -ne "adfs"} | select @{l='Computername';e={$_.name}}

Computername
------------
DC
SP2013
EX2013

Get-ADComputer -filter * | ? {$_.name -eq "sp2013"} | select @{l='Computername';e={$_.name}} | get-process

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
     96       9     1664      11264    94            2712 conhost
     94       9     1608      11004    95            5792 conhost
    326      15     1484       4032    56             392 csrss

我已确保上述过程特定于'?'/'Where'过滤器中指定的计算机。

问题是当我排除特定对象时。

我想知道它为什么会这样。我不是在寻找结果,而是试图理解语法。

此致

编辑:添加带ID的输出。我看到每个进程的3个实例(相同ID);计算机输出数量也是3。

2 个答案:

答案 0 :(得分:3)

这是一个bug .....请阅读以下内容。

我一直在使用PowerShell 4.0进行测试,看到同样的问题。如果我不允许参数受到管道的约束,我可以解决问题。

Get-ADComputer -filter '*' | 
    ? {$_.name -ne "adfs"} | 
    select @{l='Computername';e={$_.name}} | 
    %{ ps -ComputerName $_.Computername} |
    select machinename,processname,id | sort id | ft -au

这让我觉得参数绑定有问题。所以我使用trace-command来反对我觉得有问题的代码| ps$computers只是早期代码的结果。我正在测试两个主机。

Trace-Command -Name ParameterBinding -Expression {$computers | ps} -PSHost

不幸的是,除了每个单元的完全相同的条目之外,我没有看到任何其他内容。只有我认为我可以摆脱的事实是ps获取每个计算机名称。

要检查并查看是否已报告此情况。

这是一个错误

你不是第一个看到这个的人。我找到了preexisting report on this我投了票并承认我可以复制。所以现在是野兽的本性。如果你希望它工作,你需要使用我上面显示的解决方法。你的管道实力给我留下了深刻的印象。太糟糕了,这次没用了。

答案 1 :(得分:0)

在我看来,问题是ps接受管道上的过程对象,而不是计算机名称。

试试这个:

Get-ADComputer -filter * | ? {$_.name -ne "adfs"} | foreach-object{ ps -computername $_.name| select machinename,processname,id | sort id} |