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 FileInfo
objetos Get-ChildItem
em strings, conforme solicitado, mas está fazendo ao fornecer o nome do arquivo sem o caminho.
O que você precisa fazer é obter o valor da PSPath
propriedade dos objetos de entrada do pipeline e passá-lo Get-Item -LiteralPath
assim:
[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 -LiteralPath
a caminhos “normais” com curingas. A parte importante que faz isso funcionar Get-ChildItem
é o alias para PSPath
no LiteralPath
parâmetro. Você pode apenas nomear seu parâmetro PSPath
, mas LiteralPath
é mais padrão e descritivo.