Powershell删除文件名无法识别Em Dash中的Em Dash

时间:2018-11-23 16:10:25

标签: windows powershell windows-7

由于某些文件名包含Em破折号,因此我无法压缩大量文件。如here所述,我一直在尝试使用PowerShell脚本示例将En破折号(0x2014)替换为En破折号(0x2013),但在Windows 7环境中它似乎不适用于我。也就是说,PowerShell脚本似乎无法识别文件名中存在Em破折号。

例如以下文件名中的所有 ...

XXXXX DMP [版本] 部分执行[最新签名日期]

...未转换为破折号。

...但仅保留“ ”。

我提供了以下脚本,并且正在使用PowerShell版本5.1。 任何帮助表示赞赏

function Replace-Text
{param(
[Parameter(Mandatory=$true)]
$text,
$em = ([char]0x2014),
$replacementlist = "$em,-,-,-,',,%,,$,,@,,#,,&,,’,"
)
Invoke-Expression ('$text' + -join $(
foreach($e in $replacementlist.Split(',')) { 
'.Replace("{0}","{1}")' -f $e, $(
[void]$foreach.MoveNext()
$foreach.Current) 
} 
)
)
}

Get-ChildItem -Path $path | Rename-Item -NewName {(Replace-Text$_.Name).trim()}

1 个答案:

答案 0 :(得分:1)

正如TessellatingHeckler所指出的那样,它是en而不是em破折号。

我建议将-replace regex运算符与\p{Pd} unicode类一起使用(Pd =“ P 破损, d 灰”) ,它将与破折号类型和常规连字符匹配。您的替换清单也可以大大简化:

$Replacements = @{
    "[\p{Pd}]"                        = "-"
    "[$([regex]::Escape("'%$@#&’"))]" = ""
}
foreach($ReplacePattern in $Replacements.Keys){
    $text = $text -replace $ReplacePattern,$Replacements[$ReplacePattern]
}
return $text