2016-04-20 3 views
0

Я пытаюсь передать результаты запроса LDAP (компьютеры) в мою функцию Powershell. Однако функция обрабатывает только одно значение. Вот пример кода:, имеющий проблемы с трубопроводом в функции powershell

Function Get-ComputerName { 
    Param(
     [Alias('Computer','ComputerName','HostName')] 
     [Parameter(
      Mandatory=$true, 
      Position=0, 
      ValueFromPipeline=$true 
     )] 
     [Object[]]$computers 
    ) 
    if(-not($computers)) { Throw “You must supply at least one computer” } 

    foreach($computer in $computers) { 
     write-host $computer.Name 
    } 
} 

Когда я бегу:

Get-ADComputer -SearchBase 'OU="Devices",dc=FVWM1,dc=Local' -Filter '*' | Get-ComputerName 

В результате только один компьютер имя напечатано, но там обязательно должно быть больше, чем один. Помогите! Благодарю.

+0

Вы уверены, что функция процесса только первое значение, а не только в последний раз? – PetSerAl

+0

Возможно, я должен сказать «одно значение» вместо «первого значения», поскольку, технически, я не уверен, где упадет тот, который выписан с помощью write-host. – Matt

ответ

2

При использовании конвейера для передачи нескольких объектов в функцию обязательно используйте блоки Begin, Process и End. После того, как я построил собственный объект $ computers, я могу реплицировать проблему.

$computers = @() 
$computers += New-Object -TypeName PSObject -Property @{ 
    Name = "Test" 
    Note = "TestTest" 
} 
$computers += New-Object -TypeName PSObject -Property @{ 
    Name = "Test2" 
    Note = "TestTest" 
} 
$computers += New-Object -TypeName PSObject -Property @{ 
    Name = "Test3" 
    Note = "TestTest" 
} 
$computers | Get-InstalledSoftware 

Это дает test3

Решение просто обернуть внутренности функции с Process {} так:

Function Get-InstalledSoftware { 
    Param(
     [Alias('Computer','ComputerName','HostName')] 
     [Parameter(
      Mandatory=$true, 
      Position=0, 
      ValueFromPipeline=$true 
     )] 
     [Object[]]$computers 
    ) 
    Process { 
     if(-not($computers)) { Throw “You must supply at least one computer” } 

     foreach($computer in $computers) { 
      write-host $computer.Name 
     } 
    } 
} 
+0

you da man Chris – Matt

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