I was able to find how to use the GetInvalidFileNameChars() method in a PowerShell script.  However, it seems to also filter out whitespace (which is what I DON'T want).
EDIT: Maybe I'm not asking this clearly enough. I want the below function to INCLUDE the spaces that already existing in filenames. Currently, the script filters out spaces.
Function Remove-InvalidFileNameChars {  param([Parameter(Mandatory=$true,     Position=0,     ValueFromPipeline=$true,     ValueFromPipelineByPropertyName=$true)]     [String]$Name )  return [RegEx]::Replace($Name, "[{0}]" -f ([RegEx]::Escape([String][System.IO.Path]::GetInvalidFileNameChars())), '')} You can simply use C# inbuilt function " Path. GetInvalidFileNameChars() " to check if there is invalid character in file name and remove it.
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()) "\ \ \|\ \ ☺\ ☻\ ♥\ ♦\ ♣\ ♠\ \\ \t\ \n\ ♂\ \f\ \r\ ♫\ ☼\ ►\ ◄\ ↕\ ‼\ ¶\ §\ ▬\ ↨\ ↑\ ↓\ →\ ←\ ∟\ ↔\ ▲\ ▼\ :\ \*\ \?\ \\\ / PS C:\> [RegEx]::Escape(([IO.Path]::GetInvalidFileNameChars() -join ' ')) "\ \ \|\ \ ☺\ ☻\ ♥\ ♦\ ♣\ ♠\ \\ \t\ \n\ ♂\ \f\ \r\ ♫\ ☼\ ►\ ◄\ ↕\ ‼\ ¶\ §\ ▬\ ↨\ ↑\ ↓\ →\ ←\ ∟\ ↔\ ▲\ ▼\ :\ \*\ \?\ \\\ / PS C:\> [RegEx]::Escape(([IO.Path]::GetInvalidFileNameChars() -join '')) "\| ☺☻♥♦\t\n♂\f\r♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼:\*\?\\/ PS C:\> $OFS='' PS C:\> [RegEx]::Escape([string][IO.Path]::GetInvalidFileNameChars()) "\| ☺☻♥♦\t\n♂\f\r♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼:\*\?\\/
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With