Encontrei um tópico semelhante aqui no Stack Overflow.
Com o código a seguir, a maioria dos caracteres será traduzida para o "caractere mais próximo". Embora não consegui obter o ’
traduzido. (Talvez sim, não consigo criar um nome de arquivo no prompt com ele;) O ß
também não é traduzido.
function Remove-Diacritics {
param ([String]$src = [String]::Empty)
$normalized = $src.Normalize( [Text.NormalizationForm]::FormD )
$sb = new-object Text.StringBuilder
$normalized.ToCharArray() | % {
if( [Globalization.CharUnicodeInfo]::GetUnicodeCategory($_) -ne [Globalization.UnicodeCategory]::NonSpacingMark) {
[void]$sb.Append($_)
}
}
$sb.ToString()
}
$files = gci -recurse | where {$_.Name -match "[^\u0020-\u007F]"}
$files | ForEach-Object {
$newname = Remove-Diacritics $_.Name
if ($_.Name -ne $newname) {
$num=1
$nextname = $_.Fullname.replace($_.Name,$newname)
while(Test-Path -Path $nextname)
{
$next = ([io.fileinfo]$newname).basename + " ($num)" + ([io.fileinfo]$newname).Extension
$nextname = $_.Fullname.replace($_.Name,$next)
$num+=1
}
echo $nextname
ren $_.Fullname $nextname
}
}
Editar:
Eu adicionei algum código para verificar se um nome de arquivo já existe e adicione (1)
, (2)
etc ... se isso acontecer. (Não é inteligente o suficiente para detectar um (1)
já existente no nome do arquivo a ser renomeado, então nesse caso você obteria (1) (1)
. Mas como sempre ... tudo é programável;)
Editar 2 :
Aqui está o último para esta noite ...
Este tem uma função diferente para substituir os caracteres. Também foi adicionada uma linha para alterar caracteres desconhecidos, como ß
e ┤
, por exemplo, para _
.
function Convert-ToLatinCharacters {
param([string]$inputString)
[Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding("Cyrillic").GetBytes($inputString))
}
$files = gci -recurse | where {$_.Name -match "[^\u0020-\u007F]"}
$files | ForEach-Object {
$newname = Convert-ToLatinCharacters $_.Name
$newname = $newname.replace('?','_')
if ($_.Name -ne $newname) {
$num=1
$nextname = $_.Fullname.replace($_.Name,$newname)
while(Test-Path -Path $nextname)
{
$next = ([io.fileinfo]$newname).basename + " ($num)" + ([io.fileinfo]$newname).Extension
$nextname = $_.Fullname.replace($_.Name,$next)
$num+=1
}
echo $nextname
ren $_.Fullname $nextname
}
}