2015-11-19 21 views
4

當我使用過濾器來排除管道命令對象時,它沒有給我正確的輸出。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個進程 –

回答

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,我投票並承認我可以複製。所以現在是野獸的本質。如果你希望它能夠工作,你需要使用像上面展示的解決方法。你的管道實力讓我印象深刻。太糟糕了,這次沒有成功。

+0

謝謝Matt。我認爲這回答我的問題。語法是正確的,它不是行爲的方式。 –

+0

令人敬畏的研究和跟進的人,我希望我可以給一個以上的投票,這種努力免費服務。另外我以前從未見過'Trace-Command',所以很開心看到:) – TheMadTechnician

+0

@TheMadTechnician我開始更喜歡這些問題「爲什麼我不能過濾格式 - 塔科」 – Matt

0

在我看來,問題是,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參數允許通過屬性名稱輸入管道。 –