Recebendo informações de Get-ChildItem

Isso pode ou não ser óbvio, mas eu tive que descobrir isso encontrando a classe .Net para um cmdlet que implementa esse comportamento e inspecionando os atributos.

Ao criar um cmdlet que atua em arquivos, seria bom ter uma sintaxe semelhante ls c: | test. Infelizmente, o script mais simples não funcionará:

[CmdletBinding()]
param
([Parameter(Position = 0, Mandatory = $True, ValueFromPipeline = $True)][string[]]$Path)

process

{
Get-Item $Path
}

PS C
:temp> ls c: | test
Get-Item : Cannot find path 'C:tempadt-bundle-windows' because it does not exist.

O PowerShell está convertendo os FileInfoobjetos Get-ChildItemem strings, conforme solicitado, mas está fazendo ao fornecer o nome do arquivo sem o caminho.

O que você precisa fazer é obter o valor da PSPathpropriedade dos objetos de entrada do pipeline e passá-lo Get-Item -LiteralPathassim:

[CmdletBinding(DefaultParameterSetName = 'Path')]
param
([Parameter(Position = 0, ParameterSetName = 'Path', Mandatory = $True, ValueFromPipeline = $True, ValueFromPipelineByPropertyName = $True)][string[]]$Path,
[Parameter(ParameterSetName = 'LiteralPath', Mandatory = $True, ValueFromPipeline = $False, ValueFromPipelineByPropertyName = $True)][Alias('PSPath')][string[]]$LiteralPath)

process

{
if ($PSCmdlet.ParameterSetName -eq 'Path')
{
Get-Item $Path
}
else
{
Get-Item -LiteralPath $LiteralPath
}
}

PS C
:temp> ls c: | test


Directory: C:


Mode LastWriteTime Length Name
---- ------------- ------ ----
d
---- 2012-12-08 4:19 PM adt-bundle-windows

Os conjuntos de parâmetros são necessários se você deseja oferecer suporte -LiteralPatha caminhos “normais” com curingas. A parte importante que faz isso funcionar Get-ChildItemé o alias para PSPathno LiteralPathparâmetro. Você pode apenas nomear seu parâmetro PSPath, mas LiteralPathé mais padrão e descritivo.