Batch omdøbning af filer med internationale chars på Windows XP

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en hel masse filer med filnavne ved hjælp af vores dejlige svenske bogstaver å å og ø .
Af forskellige grunde skal jeg nu konvertere disse til et [[a-zA-Z]] område. Det er ret nemt at fjerne alt uden for dette område. Det, der forårsager mig problemer, er, at jeg vil erstatte å med en , ø med o og så videre.


Dette er charset problemer på deres værste.


Jeg har et sæt testfiler:


filesCopy of New Text Documen åäö t.txt
filesfofo.txt
filesNew Text Document.txt
filesworstcase åäöÅÄÖéÉ.txt


Jeg baserer mit script på denne linje og piper det s resultater i forskellige kommandoer


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


Den sjældne ting er, at hvis jeg udskriver resultaterne af dette (den almindelige for-loop der er) i en fil, får jeg denne output:


filesCopy of New Text Documen †„” t.txt
filesfofo.txt
filesNew Text Document.txt
filesworstcase †„”Ž™‚.txt


Så der sker noget fornuftigt med mine filnavne, før de selv når de andre værktøjer (jeg har forsøgt at gøre dette ved at bruge en sed port til Windows fra noget, der hedder GnuWin32, men ikke heldige hidtil) og erstatning på disse tegn gør det ikke hjælp enten.


Hvordan ville du løse dette problem? Jeg er åben for enhver form for værktøjer, kommandolinje eller på anden måde



EDIT: Dette er et one-time problem, så jeg søger en hurtig 'n grim fix'

Bedste reference


Du kan bruge denne kode (Python)


Omdøb internationale filer



# -*- 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 "
Dir : " + 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)

###


Du skal ændre din kodning og dine char tabeller (jeg testede dette script med spanske filer og fungerer fint). Du kan kommentere linjen 'Flyt' for at kontrollere, om det virker ok, og fjern kommentaren senere for at gøre omdøbet.

Andre referencer 1


Du har måske held og lykke i cmd.exe, hvis du åbnede det i UNICODE-tilstand. Brug 'cmd/U'.


Andre har foreslået at bruge et rigtigt programmeringssprog. Det er fint, især hvis du har et sprog, du er meget komfortabel med. Min ven på C # holdet siger, at C # 3.0 (med Linq) er velegnet til at piske hurtig og lille programmer som denne. Han har holdt op med at skrive batch filer mest af tiden.


Personligt ville jeg vælge PowerShell. Dette problem kan løses lige på kommandolinjen og i en enkelt linje. Syg


EDIT: det er ikke en linje, men det er heller ikke meget kode. Det ser også ud til, at StackOverflow ikke kan lide syntaxen '$ \_. Name' og gør \_ as & 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.
}

Andre referencer 2


Jeg ville skrive dette i C ++, C # eller Java - miljøer, hvor jeg helt sikkert ved, at du kan få Unicode-tegnene ud af en sti korrekt. Det er altid usikkert med kommandolinjeværktøjer, især ud af Cygwin.


Så er koden et simpelt find/erstat eller regex/erstat. Hvis du kan navngive et sprog, ville det være nemt at skrive koden.

Andre referencer 3


Jeg skriver et vbscript (WSH) for at scanne katalogerne, så send filnavnet til en funktion, der opdeler filnavne i deres individuelle bogstaver, så gør en SELECT CASE på de svenske og erstatter dem med dem, du vil. , i stedet for at gøre det, kunne funktionen bare slippe det igennem en masse REPLACE () -funktioner, og omfordele output til inputstrengen. I slutningen omdøber den filen med den nye værdi.