Quando um comando do PowerShell encadeia (pipe) algo para outro comando, esse comando pode enviar um objeto. Um objeto pode ser de qualquer tipo. Esse objeto possui um conjunto de métodos e propriedades. Podemos referir-nos a esses métodos e propriedades num objeto independente, criando o objeto, atribuindo-o a uma variável e, em seguida, referenciando as suas propriedades e métodos dessa maneira.
Por exemplo, o cmdlet Get-Item retorna um objeto System.IO.DirectoryInfo ao consultar uma pasta.
Get-Item -Path 'C:\Windows' | Get-Member

Uso do GetItem para consultar uma pasta
Esse objeto tem muitos métodos e propriedades diferentes que podemos referenciar. Poderia chamar métodos nesse objeto ou referir-se a suas propriedades.
PS C:\> $windowsDir.GetFiles() Mode LastWriteTime Length Name---- ------------- ------ -----a-h-- 6/14/2017 8:24 AM 12292 .DS_Store-a-h-- 6/14/2017 8:22 AM 4096 ._.DS_Store-a---- 7/22/2017 6:00 PM 64512 bfsvc.exe-a--s- 4/8/2018 3:16 AM 67584 bootstat.dat-a---- 10/8/2016 1:15 PM 232960 DfsrAdmin.exe-a---- 8/9/2017 10:28 AM 1315 DfsrAdmin.exe.config<SNIP> PS C:\> $windowsDir.LastWriteTime Sunday, April 8, 2018 6:00:19 AM
Mas, e se eu estiver a usar um cmdlet como Get-ChildItem , que enumera muitas pastas de uma só vez? Seria louco atribuir variáveis como $ dir1 , $ dir2 e $ dir3 a todas elas. Precisamos de uma maneira mais dinâmica para representá-los. Precisamos de uma única variável que represente cada objeto da pasta no processamento. Precisamos da variável pipeline!
Usando o exemplo Get-ChildItem , digamos que desejo encontrar todas as pastas na pasta C: \ Windows usando Get-ChildItem -Path C: \ Windows \ -Directory . Este comando retorna algumas dezenas de pastas. Se atribuíssemos essa saída a uma variável, seria uma matriz de objetos, não apenas um único objeto. Em vez disso, posso canalizar todos esses objetos, um de cada vez, de Get-ChildItem para ForEach-Object e fazer referência à variável de pipeline.
A variável de pipeline ( $ _ ou $PSItem ) representa cada objeto na cadeia. Pode ver abaixo que posso referenciar a propriedade Name para cada pasta processada usando $ _. Name .
PS C:\> Get-ChildItem -Path C:\Windows\ -Directory | ForEach-Object { $_.Name }addinsADFSappcompatAppPatchAppReadinessassembly<SNIP>
Com a variável pipeline, podemos fazer referência a qualquer método e propriedade. A variável sempre será do mesmo tipo que o objeto proveniente do comando anterior. Pode ver abaixo que, se canaliza a própria variável de pipeline para Get-Member , ela retornará o mesmo tipo de objeto System.IO.DirectoryInfo que Get-Item .
PS C:\> Get-ChildItem -Path C:\Windows\ -Directory | ForEach-Object { $PSItem | Get-member } | Select-Object -First 1 TypeName: System.IO.DirectoryInfo <SNIP>
Verá a variável de pipeline usada com mais frequência em comandos que precisam fazer referência ou executar alguma ação específica em cada objeto processado. Outro exemplo é usar as propriedades calculadas do cmdlet Select-Object . Isso permite que o script manipule a saída retornada fazendo referência a objetos do pipeline.
Por exemplo, em vez de usar o ForEach-Object para retornar apenas os nomes da pasta, poderia usar uma propriedade calculada para criar uma propriedade DirectoryName em tempo real e atribuir os nomes da pasta.
PS C:\> Get-ChildItem -Path C:\Windows\ -Directory | Select-Object -Property @{ Name = 'DirectoryName'; Expression = { $_.Name } } DirectoryName-------------addinsADFSappcompatAppPatchAppReadinessassembly<SNIP>
Assim, podemos usar a variável pipeline em muitos cenários diferentes.