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
}
}