在 Windows XP 上批量重命名具有国际字符的文件

Posted

技术标签:

【中文标题】在 Windows XP 上批量重命名具有国际字符的文件【英文标题】:Batch renaming of files with international chars on Windows XP 【发布时间】:2010-09-08 14:04:24 【问题描述】:

我有一大堆文件,文件名使用我们可爱的瑞典字母 å åö。 由于各种原因,我现在需要将这些转换为 [a-zA-Z] 范围。只需删除此范围之外的任何内容都相当容易。给我带来麻烦的事情是我想用 a 替换 å,用 o 替换 ö 和很快。

这是最糟糕的字符集问题。

我有一组测试文件:

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

所以我的文件名在它们到达其他工具之前就发生了一些奇怪的事情(我一直在尝试使用来自称为 GnuWin32 的 Windows 的 sed 端口来做到这一点,但到目前为止没有运气)并对这些字符进行替换也无济于事。

你会如何解决这个问题?我对任何类型的工具、命令行或其他工具都持开放态度……

编辑:这是一次性的问题,所以我正在寻找一个快速的'n丑陋'修复

【问题讨论】:

【参考方案1】:

我会在 C++、C# 或 Java 中编写此代码——我确信可以在这些环境中正确地从路径中获取 Unicode 字符。命令行工具总是不确定的,尤其是在 Cygwin 之外。

那么代码就是一个简单的查找/替换或正则表达式/替换。如果您可以命名一种语言,那么编写代码将很容易。

【讨论】:

【参考方案2】:

我会编写一个 vbscript (WSH) 来扫描目录,然后将文件名发送到一个函数,该函数将文件名分解为单独的字母,然后对瑞典语的文件名执行 SELECT CASE 并将它们替换为您的文件名想。或者,该函数可以不这样做,而是通过一堆 REPLACE() 函数将其删除,将输出重新分配给输入字符串。最后,它会使用新值重命名文件。

【讨论】:

【参考方案3】:

如果您在 UNICODE 模式下打开 cmd.exe,您可能会更幸运。使用“cmd /U”。

其他人建议使用真正的编程语言。这很好,特别是如果你有一种你非常熟悉的语言。我在 C# 团队的朋友说 C# 3.0(带有 Linq)非常适合快速编写这样的小程序。他大部分时间都停止编写批处理文件了。

就个人而言,我会选择 PowerShell。这个问题可以直接在命令行上解决,并且在一行中。我会

编辑:它不是一行,但也不是很多代码。此外,看起来 *** 不喜欢语法“$_.Name”,并将 _ 呈现为 _。

$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.

【讨论】:

【参考方案4】:

您可以使用此代码(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)

###

你必须改变你的编码和你的字符表(我用西班牙语文件测试了这个脚本并且工作正常)。您可以评论“移动”行以检查它是否工作正常,稍后删除评论以进行重命名。

【讨论】:

以上是关于在 Windows XP 上批量重命名具有国际字符的文件的主要内容,如果未能解决你的问题,请参考以下文章

递归批量重命名文件扩展名(Windows批处理)

通过添加当前电脑名称来批量重命名电脑

在 Windows 中使用索引保留批量重命名文件

windows dos 批量重命名文件

windows dos 批量重命名文件

在 Windows 7 中使用 REN 批量重命名文件(添加前缀)