Isso não parece ser um bug de pipeline geral, mas sim uma peculiaridade com os Cmdlets do AD e a maneira como as Propriedades carregadas do Active Directory são preenchidas.
Se você canalizar todo o objeto Computador como Object
s (convertido usando [Object []] no seu bloco de parâmetros) e inspecionar as propriedades do objeto com $_.psobject.Properties
, deverá ver internamente, o objeto passado para o cmdlet Test- tem todos os Atributos do AD armazenados em uma única propriedade de matriz chamada Properties
(yay para nomear confusão) e as "propriedades" que você vê quando canaliza o objeto para Get-Member são realmente dinâmicas e preenchidas este array.
Uma maneira mais elegante de garantir que a propriedade DNSHostName
seja preenchida e funcione durante a execução dos objetos do computador seria:
Get-ADComputer -Filter * | Select-Object -Property DNSHostName | Test-SomethingOnAllComputers
ou
Get-ADComputer -Filter * | Select-Object -Property * | Test-SomethingOnAllComputers
Isso deve forçar as propriedades a persistirem se você quiser, assim como seu exemplo foreach.
Com relação a Write-Progress
, o problema é que, quando o piping de outro Cmdlets, você não pode saber quantos objetos esperar quando você começar a processar o primeiro bloco.
Se você quiser usar Write-Progress -PercentCompleted
, primeiro precisará carregar todos os seus computadores em uma coleção e, em seguida, executar o cmdlet Test-
, efetivamente derrotando seus esforços de Pipelining:
$Computers = Get-ADComputer -Filter * |Select-Object -ExpandProperty DNSHostName
Test-SomethingOnAllComputers -ComputerName $Computers
E então tem algo parecido com isso no bloco Begin:
$ComputerCount = $ComputerName.Count
$i = 0
Agora você deve ser capaz de fazer
$i++
Write-Progress -Activity "Doing Stuff" -Status "Doing stuff to $ComputerName" -PercentComplete $($i/$ComputerCount * 100)
Não faça isso com a entrada de pipeline, pois $ComputerCount
seria zero e somente Chuck Norris pode dividir por zero