Пакетное переименование файлов с международными символами в Windows XP

StackOverflow https://stackoverflow.com/questions/56913

Вопрос

У меня есть целая куча файлов, имена которых состоят из наших прекрасных шведских букв. å å и ö.По разным причинам мне теперь нужно преобразовать их в диапазон [a-zA-Z].Просто удалить все, что находится за пределами этого диапазона, довольно легко.Меня беспокоит то, что я хотел бы заменить å с а, ö с о и так далее.

Это худшие проблемы с кодировкой.

У меня есть набор тестовых файлов:

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

Я основываю свой скрипт на этой строке, передавая ее результаты в различные команды.

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

Странно то, что если я распечатаю результаты этого (то есть простого цикла for) в файл, я получу такой вывод:

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

Итак, что-то странное происходит с моими именами файлов еще до того, как они достигают других инструментов (я пытался сделать это, используя порт sed для Windows из чего-то под названием GnuWin32, но пока безуспешно), и замена этих символов не дает результатов. помогите же.

Как бы вы решили эту проблему?Я открыт для любого типа инструментов, командной строки или чего-то еще…

РЕДАКТИРОВАТЬ: Это единовременная проблема, поэтому я ищу быстрое и некрасивое решение.

Это было полезно?

Решение

Вы можете использовать этот код (Python)

Переименуйте международные файлы

# -*- 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)

###

Вам необходимо изменить кодировку и таблицы символов (я тестировал этот сценарий на испанских файлах, и он работает нормально).Вы можете прокомментировать строку «переместить», чтобы проверить, работает ли она нормально, а позже удалить комментарий, чтобы выполнить переименование.

Другие советы

Возможно, вам повезет больше с cmd.exe, если вы откроете его в режиме UNICODE.Используйте «cmd/U».

Другие предложили использовать настоящий язык программирования.Это нормально, особенно если у вас есть язык, на котором вам очень комфортно.Мой друг из команды C# говорит, что C# 3.0 (с Linq) хорошо подходит для создания быстрых небольших программ, подобных этой.Большую часть времени он перестал писать пакетные файлы.

Лично я бы выбрал PowerShell.Эту проблему можно решить прямо в командной строке, причем в одной строке.Больной

РЕДАКТИРОВАТЬ:это не одна строка, но и не так много кода.Кроме того, похоже, что StackOverflow не нравится синтаксис «$_.Name» и отображает _ как &#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.
}

Я бы написал это на C++, C# или Java — в средах, где я точно знаю, что вы можете правильно извлечь символы Юникода из пути.Всегда неясно с инструментами командной строки, особенно из Cygwin.

Тогда код представляет собой простой поиск/замену или регулярное выражение/замену.Если вы можете назвать язык, написать код будет легко.

Я бы написал vbscript (WSH) для сканирования каталогов, затем отправил имена файлов в функцию, которая разбивает имена файлов на отдельные буквы, затем выполняет SELECT CASE для шведских и заменяет их теми, которые вы хотите.Или вместо этого функция может просто пропустить его через группу функций REPLACE(), переназначив вывод входной строке.В конце он переименовывает файл с новым значением.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top