Saya menemukan topik serupa sini pada Stack Overflow.
Dengan kode berikut sebagian besar karakter akan diterjemahkan ke "karakter terdekat" mereka. Meskipun saya tidak bisa mendapatkan ’ diterjemahkan. (Mungkin ya, saya tidak bisa membuat nama file di prompt dengan itu;) The ß juga tidak diterjemahkan.
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
}
}
Edit:
Saya menambahkan beberapa kode untuk memeriksa apakah nama file sudah ada dan tambahkan (1), (2) dll ... jika ya. (Tidak cukup pintar untuk mendeteksi yang sudah ada (1) dalam nama file yang akan diganti nama sehingga dalam hal ini Anda akan mendapatkan (1) (1). Tapi seperti biasa ... semuanya bisa diprogram;)
Edit 2 :
Ini yang terakhir untuk malam ini ...
Yang ini memiliki fungsi berbeda untuk mengganti karakter. Juga menambahkan garis untuk mengubah karakter yang tidak dikenal suka ß dan ┤ misalnya untuk _.
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
}
}