2015-11-19 4 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 

Итак, нет. процессов, которые мы видим, больше, чем фактические. процессов на машине. Однако нет конкретных процессов (обмен и sharepoint) с другой машины.


Для проверки моей команды я гарантировал, что следующий результат будет таким, как ожидалось.

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 

я обеспечил выше процесс является специфическим для компьютера, указанным в «?»/«Где» фильтра.

Проблема заключается в том, что я исключаю определенный объект.

Я хотел бы знать, почему он ведет себя таким образом. Я не ищу результат, но пытаюсь понять синтаксис.

С уважением

EDIT: Добавлен вывод с идентификатором. Я вижу 3 экземпляра каждого процесса (одинаковый идентификатор); № выхода компьютера также 3.

+0

Вы действительно уверены, что количество процессов неправильное? Что происходит, когда вы запускаете 'Get-Process -ComputerName DC' вручную? –

+2

Вы можете изменить свой окончательный выбор на 'select machinename, processname, 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 Я начинаю наслаждаться этими вопросами больше, чтобы «почему я не могу фильтровать формат-taco» – Matt

0

Похоже, проблема заключается в том, что ps принимает объекты процесса на конвейере, а не на устройствах.

Попробуйте это:

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

Я не думаю, что это проблема, 'select @ {l = 'ComputerName'; e = {$ _. Name}}' должен был позаботиться об этом –

+0

Спасибо Майку. Я до сих пор не понимаю, почему команда не работает при использовании, где исключить конкретный компьютер и работает при указании определенного компьютера ... Я все еще участвую. –

+0

Я вижу это сейчас. Раздел «Ввод» справки по get-process не упоминает об этом, но параметр ComputerName разрешает ввод конвейера по имени свойства. –

 Смежные вопросы

  • Нет связанных вопросов^_^