2008-09-11 11 views
1

Ich habe eine ganze Reihe von Dateien mit Dateinamen mit unseren schönen schwedischen Buchstaben å å und ö. Aus verschiedenen Gründen muss ich diese nun in einen [a-zA-Z] -Bereich konvertieren. Nur etwas außerhalb dieses Bereichs zu entfernen, ist ziemlich einfach. Die Sache, die mir Probleme verursacht ist, dass ich å mit einem, ö mit o und so weiter ersetzen möchte.Batch umbenennen von Dateien mit internationalen Zeichen unter Windows XP

Dies ist Zeichensatzprobleme im schlimmsten Fall.

Ich habe eine Reihe von Testdateien:

files\Copy of New Text Documen åäö t.txt 
files\fofo.txt 
files\New Text Document.txt 
files\worstcase åäöÅÄÖéÉ.txt 

ich mein Skript auf dieser Linie zu stützen, ist es die Ergebnisse in verschiedene Befehle kochend

for %%X in (files\*.txt) do (echo %%X) 

Die wierd Sache ist, dass, wenn ich drucken die Ergebnisse dieser (die Ebene for-Schleife, die ist) in eine Datei erhalte ich diese Ausgabe:

files\Copy of New Text Documen †„” t.txt 
files\fofo.txt 
files\New Text Document.txt 
files\worstcase †„”Ž™‚.txt 

So etwas wierd passiert mit meinen Dateinamen, bevor sie überhaupt die anderen Werkzeuge erreichen (ich habe versucht, dies unter Verwendung eines sed-Anschlusses für Windows von etwas zu tun, das GnuWin32 genannt wird, aber bisher kein Glück) und das Ersetzen dieser Zeichen hilft auch nicht.

Wie würden Sie dieses Problem lösen? Ich bin offen für jede Art von Werkzeugen, Commandline oder sonst ...

EDIT: Dies ist ein einmaliges Problem, so dass ich bin auf der Suche nach einem schnellen ‚n hässlich fix

Antwort

1

Sie diesen Code verwenden können (Python)

umbenennen internationale Dateien

# -*- coding: cp1252 -*- 

import os, shutil 

base_dir = "g:\\awk\\" # Base Directory (includes subdirectories) 
char_table_1 = "áéíóúñ" 
char_table_2 = "aeioun" 

adirs = os.walk (base_dir) 

for adir in adirs: 
    dir = adir[0] + "\\"   # Directory 
    # print "\nDir : " + dir 

    for file in adir[2]: # List of files 
     if os.access(dir + file, os.R_OK): 
      file2 = file 
      for i in range (0, len(char_table_1)): 
       file2 = file2.replace (char_table_1[i], char_table_2[i]) 

      if file2 <> file: 
       # Different, rename 
       print dir + file, " => ", file2 
       shutil.move (dir + file, dir + file2) 

### 

Sie haben Ihre Codierung und Ihre Zeichen ändern (Ich habe dieses Skript mit spanischen Dateien getestet und funktioniert einwandfrei.) Sie können die Zeile "move" kommentieren, um zu überprüfen, ob sie in Ordnung ist, und den Kommentar später entfernen, um die Umbenennung vorzunehmen.

0

ich dies schreibe würde in C++, C# oder Java - Umgebungen, in denen ich sicher bin, dass Sie die Unicode-Zeichen aus einem Pfad entfernen können. Bei Kommandozeilen-Tools, insbesondere bei Cygwin, ist es immer unsicher.

Dann ist der Code ein einfacher suchen/ersetzen oder regex/ersetzen. Wenn Sie eine Sprache benennen können, wäre es einfach, den Code zu schreiben.

0

Ich würde ein VBScript (WSH) schreiben, um die Verzeichnisse zu scannen, dann senden Sie die Dateinamen an eine Funktion, die die Dateinamen in ihre einzelnen Buchstaben aufteilt, macht dann einen SELECT CASE auf den schwedischen und ersetzt sie durch die Sie wollen. Oder, statt dies zu tun, könnte die Funktion es einfach durch eine Reihe von REPLACE() -Funktionen ablegen und die Ausgabe der Eingabe-Zeichenkette neu zuweisen. Am Ende benennt es dann die Datei mit dem neuen Wert um.

1

Sie könnten mehr Glück in cmd.exe haben, wenn Sie es im UNICODE-Modus geöffnet haben. Verwenden Sie "cmd/U".

Andere haben vorgeschlagen, eine echte Programmiersprache zu verwenden. Das ist in Ordnung, besonders wenn Sie eine Sprache haben, mit der Sie sich sehr wohl fühlen. Mein Freund im C# -Team sagt, dass C# 3.0 (mit Linq) gut geeignet ist, um schnelle, kleine Programme wie dieses aufzusetzen. Er hat die meiste Zeit damit aufgehört, Batch-Dateien zu schreiben.

Persönlich würde ich PowerShell wählen. Dieses Problem kann direkt in der Befehlszeile und in einer einzelnen Zeile gelöst werden. Ich werde

EDIT: es ist nicht eine Zeile, aber es ist auch nicht viel Code. Außerdem scheint StackOverflow die Syntax "$ _" nicht zu mögen.Name“, und macht die _ als & # 95.

$mapping = @{ 
    "å" = "a" 
    "ä" = "a" 
    "ö" = "o" 
} 

Get-ChildItem -Recurse . *.txt | Foreach-Object { 
    $newname = $_.Name  
    foreach ($l in $mapping.Keys) { 
     $newname = $newname.Replace($l, $mapping[$l]) 
     $newname = $newname.Replace($l.ToUpper(), $mapping[$l].ToUpper()) 
    } 
    Rename-Item -WhatIf $_.FullName $newname # remove the -WhatIf when you're ready to do it for real. 
}