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

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

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

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

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, но пока не повезло), и замена этих символов не тоже помогите.

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

Обновлено: Это разовая проблема, поэтому я ищу быстрое некрасивое решение

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
3 185
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

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

Возможно, вам повезет с 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.
}
Ответ принят как подходящий

Вы можете использовать этот код (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)

###

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

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