Powershell удалить Em Dash в имени файла, не распознающего Em Dash - PullRequest
0 голосов
/ 23 ноября 2018

Я не могу заархивировать большое количество файлов, так как некоторые имена файлов содержат символ тире Em.Я пытался использовать примеры сценариев PowerShell для замены Em dash (0x2014) на En dash (0x2013), как описано здесь , но, похоже, он не работает для меня в моей среде Windows 7,т. е. скрипт PowerShell, по-видимому, не распознает наличие символа «тире» в имени файла.

например, все - в следующем имени файла ...

XXXXX - DMP - [версия] - Частично выполнено [Дата последней подписи]

... не преобразуется в тире En.

..., но просто сохраняет ' - '.

Я предоставил приведенный ниже скрипт и использую 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 голосов
/ 23 ноября 2018

Как уже отмечал TessellatingHeckler, это черта en, а не черта em.

Я бы предложил использовать оператор регулярного выражения -replace с классом Unicode \p{Pd} (Pd =« P unctuation, d ashhes»), что будет соответствовать обоим типам тире, а также обычным дефисам.Ваш список замены также может быть значительно упрощен:

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