当我使用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。
答案 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} |