Casting the character array to System.String
actually seems to join the array elements with spaces, meaning that
[string][System.IO.Path]::GetInvalidFileNameChars()
does the same as
[System.IO.Path]::GetInvalidFileNameChars() -join ' '
when you actually want
[System.IO.Path]::GetInvalidFileNameChars() -join ''
As @mjolinor mentioned (+1), this is caused by the output field separator ($OFS
).
Evidence:
PS C:> [RegEx]::Escape([string][IO.Path]::GetInvalidFileNameChars())
" | ? ? ? ? ? ? \
♂ f
? ? ? ? ? ? ? § ? ? ↑ ↓ → ← ∟ ? ▲ ▼ : * ? \ /
PS C:> [RegEx]::Escape(([IO.Path]::GetInvalidFileNameChars() -join ' '))
" | ? ? ? ? ? ? \
♂ f
? ? ? ? ? ? ? § ? ? ↑ ↓ → ← ∟ ? ▲ ▼ : * ? \ /
PS C:> [RegEx]::Escape(([IO.Path]::GetInvalidFileNameChars() -join ''))
"| ????
♂f
???????§??↑↓→←∟?▲▼:*?\/
PS C:> $OFS=''
PS C:> [RegEx]::Escape([string][IO.Path]::GetInvalidFileNameChars())
"| ????
♂f
???????§??↑↓→←∟?▲▼:*?\/
Change your function to something like this:
Function Remove-InvalidFileNameChars {
param(
[Parameter(Mandatory=$true,
Position=0,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true)]
[String]$Name
)
$invalidChars = [IO.Path]::GetInvalidFileNameChars() -join ''
$re = "[{0}]" -f [RegEx]::Escape($invalidChars)
return ($Name -replace $re)
}
and it should do what you want.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…