Powershell 如何在尝试保存文件名之前去除非法字符?
我能够找到如何在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
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()))]+","_"