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.
这是一个错误.....阅读下文。
我一直在使用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,我投票并承认我可以复制。所以现在是野兽的本质。如果你希望它能够工作,你需要使用像上面展示的解决方法。你的管道实力让我印象深刻。太糟糕了,这次没有成功。
谢谢Matt。我认为这回答我的问题。语法是正确的,它不是行为的方式。 –
令人敬畏的研究和跟进的人,我希望我可以给一个以上的投票,这种努力免费服务。另外我以前从未见过'Trace-Command',所以很开心看到:) – TheMadTechnician
@TheMadTechnician我开始更喜欢这些问题“为什么我不能过滤格式 - 塔科” – Matt
在我看来,问题是,ps
接受管道上的过程对象,而不是computernames。
试试这个:
Get-ADComputer -filter * | ? {$_.name -ne "adfs"} | foreach-object{ ps -computername $_.name| select machinename,processname,id | sort id} |
我不认为这是问题,'select @ {l ='ComputerName'; e = {$ _。Name}}'应该已经处理了这个问题 –
感谢Mike。我仍然不明白,为什么命令在使用何处排除特定计算机时不起作用,并且在指定特定计算机时工作......我仍在学习。 –
我现在看到它。 get-process帮助的“Input”部分没有提及它,但ComputerName参数允许通过属性名称输入管道。 –
您是否确定进程数量错误?手动运行“Get-Process -ComputerName DC”时会发生什么? –
您可以将您的最终选择更改为'select machinename,processname,id'。通过这种方式,您将看到所有进程ID以知道是否有任何重复。 – Matt
“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个进程 –