Powershell管道与不符合预期的行为

问题描述:

当我使用过滤器来排除管道命令对象时,它没有给我正确的输出。Powershell管道与不符合预期的行为

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 

我已确保上述过程是针对在“?” /“在哪里”过滤器指定的计算机。

问题是当我排除一个特定的对象。

我想知道为什么它是表现这种方式。我不是在寻找结果,而是试图理解语法。

问候

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

+0

您是否确定进程数量错误?手动运行“Get-Process -ComputerName DC”时会发生什么? –

+2

您可以将您的最终选择更改为'select machinename,processname,id'。通过这种方式,您将看到所有进程ID以知道是否有任何重复。 – Matt

+0

“Get-Process -ComputerName DC”返回45个进程。鉴于“Get-ADComputer -filter * |?{$ _。name -ne”adfs“} | select @ {l ='Computername'; e = {$ _。name}} | ps | select machinename,processname | sort processname | ft -au“会返回139个进程 –

这是一个错误.....阅读下文。

我一直在使用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,我投票并承认我可以复制。所以现在是野兽的本质。如果你希望它能够工作,你需要使用像上面展示的解决方法。你的管道实力让我印象深刻。太糟糕了,这次没有成功。

+0

谢谢Matt。我认为这回答我的问题。语法是正确的,它不是行为的方式。 –

+0

令人敬畏的研究和跟进的人,我希望我可以给一个以上的投票,这种努力免费服务。另外我以前从未见过'Trace-Command',所以很开心看到:) – TheMadTechnician

+0

@TheMadTechnician我开始更喜欢这些问题“为什么我不能过滤格式 - 塔科” – Matt

在我看来,问题是,ps接受管道上的过程对象,而不是computernames。

试试这个:

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

我不认为这是问题,'select @ {l ='ComputerName'; e = {$ _。Name}}'应该已经处理了这个问题 –

+0

感谢Mike。我仍然不明白,为什么命令在使用何处排除特定计算机时不起作用,并且在指定特定计算机时工作......我仍在学习。 –

+0

我现在看到它。 get-process帮助的“Input”部分没有提及它,但ComputerName参数允许通过属性名称输入管道。 –