Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to strip illegal characters before trying to save filenames?

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())), '')} 
like image 690
MKANET Avatar asked Apr 14 '14 17:04

MKANET


People also ask

How do I remove an illegal character from path?

You can simply use C# inbuilt function " Path. GetInvalidFileNameChars() " to check if there is invalid character in file name and remove it.


1 Answers

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.

like image 68
Ansgar Wiechers Avatar answered Sep 29 '22 13:09

Ansgar Wiechers