Ma fonction powershell doit accepter une liste de chemins d'accès valides de fichiers et/ou de répertoires mixtes, soit en tant que paramètre nommé, soit via un pipeline, filtrer les fichiers qui correspondent à un modèle et renvoyer la liste des fichiers.
$Paths = 'C:\MyFolder\','C:\MyFile'
Ça marche : Get-Files -Paths $Paths
Ce n'est pas le cas : $Paths | Get-Files
$PSDefaultParameterValues = @{
"Get-Files:Paths" = ( Get-Location ).Path
}
[regex]$DateRegex = '(20\d{2})([0-1]\d)([0-3]\d)'
[regex]$FileNameRegex = '^term2-3\.7_' + $DateRegex + '\.csv$'
Function Get-Files {
[CmdletBinding()]
[OutputType([System.IO.FileInfo[]])]
[OutputType([System.IO.FileInfo])]
param (
[Parameter(
Mandatory = $false, # Should default to $cwd provided by $PSDefaultParameterValues
ValueFromPipeline,
HelpMessage = "Enter filesystem paths that point either to files directly or to directories holding them."
)]
[String[]]$Paths
)
begin {
[System.IO.FileInfo[]]$FileInfos = @()
[System.IO.FileInfo[]]$SelectedFileInfos = @()
}
process { foreach ($Path in $Paths) {
Switch ($Path) {
{ Test-Path -Path $Path -PathType leaf } {
$FileInfos += (Get-Item $Path)
}
{ Test-Path -Path $Path -PathType container } {
foreach ($Child in (Get-ChildItem $Path -File)) {
$FileInfos += $Child
}
}
Default {
Write-Warning -Message "Path not found: $Path"
continue
}
}
$SelectedFileInfos += $FileInfos | Where-Object { $_.Name -match $FileNameRegex }
$FileInfos.Clear()
} }
end {
Return $SelectedFileInfos | Get-Unique
}
}
J'ai constaté que les deux versions fonctionnent si je supprime la valeur du paramètre par défaut. Pourquoi ?
Pourquoi le passage d'un paramètre via le pipeline provoque-t-il une erreur lorsque ce paramètre a une valeur par défaut définie dans PSDefaultParameterValues, et existe-t-il un moyen de contourner ce problème ?