Powershell 如何在尝试保存文件名之前去除非法字符?

Powershell 如何在尝试保存文件名之前去除非法字符?,powershell,powershell-2.0,powershell-3.0,Powershell,Powershell 2.0,Powershell 3.0,我能够找到如何在PowerShell脚本中使用GetInvalidFileNameChars()方法。然而,它似乎也过滤掉了空白(这是我不想要的) 编辑:也许我问得不够清楚。我希望下面的函数包含文件名中已经存在的空格。当前,脚本会过滤掉空格 Function Remove-InvalidFileNameChars { param([Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueF

我能够找到如何在PowerShell脚本中使用
GetInvalidFileNameChars()
方法。然而,它似乎也过滤掉了空白(这是我不想要的)

编辑:也许我问得不够清楚。我希望下面的函数包含文件名中已经存在的空格。当前,脚本会过滤掉空格

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())), '')}

我怀疑这与regex操作将非显示字符强制为[string]有关(并最终表示为空格)

看看这是否效果更好:

([char[]]$name | where { [IO.Path]::GetinvalidFileNameChars() -notcontains $_ }) -join ''
这将进行直接的字符比较,而且似乎更可靠(嵌入的空格不会被删除)


编辑-我相信@Ansgar关于将字符数组转换为字符串所导致的空格是正确的。空间由$OFS引入。

[System.IO.Path]::GetInvalidFileNameChars()
返回无效字符数组。如果它为您返回空格字符(我不这样做),您可以始终迭代数组并删除它

> $chars = @()
> foreach ($c in [System.IO.Path]::GetInvalidFileNameChars())
  {
     if ($c -ne ' ')
     {
        $chars += $c
     }
  }

然后可以使用
$chars
,就像使用
GetInvalidFileNameChars()
的输出一样,将字符数组强制转换为
系统。字符串实际上似乎用空格连接数组元素,这意味着

[string][System.IO.Path]::GetInvalidFileNameChars()

[System.IO.Path]::GetInvalidFileNameChars() -join ' '
当你真正想要的时候

[System.IO.Path]::GetInvalidFileNameChars() -join ''
如上所述(+1),这是由(
$OFS
)引起的

证据:

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♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼:\*\?\\/
它应该做你想做的。

我想用空格替换所有非法字符,这样空格就被空格替换了

$Filename = $ADUser.SamAccountName
[IO.Path]::GetinvalidFileNameChars() | ForEach-Object {$Filename = $Filename.Replace($_," ")}
$Filename = "folder\" + $Filename.trim() + ".txt"

请使用相同的底层函数尝试此一行程序

相配


“?Some”文件名我目前最喜欢的方法是:

$Path.Split([IO.Path]::GetInvalidFileNameChars()) -join '_'
这将所有无效字符替换为
,与以下替代方案相比,它具有很强的可读性:

$Path -replace "[$([RegEx]::Escape([string][IO.Path]::GetInvalidFileNameChars()))]+","_"

非常好的解决方案,Rob。非常感谢您解释并发布一个有效的解决方案!简单干净!
$Path.Split([IO.Path]::GetInvalidFileNameChars()) -join '_'
$Path -replace "[$([RegEx]::Escape([string][IO.Path]::GetInvalidFileNameChars()))]+","_"