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

时间:2008-09-11 15:36:40

标签: windows file batch-file utf-8 rename

我有一大堆带有文件名的文件,使用我们可爱的瑞典字母ååö。 由于各种原因,我现在需要将它们转换为[a-zA-Z]范围。只需删除此范围之外的任何内容都相当容易。导致我麻烦的是我想用一个替换åö 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端口但到目前为止没有运气)并对这些字符进行替换也没有帮助。

你会如何解决这个问题?我愿意接受任何类型的工具,命令行或其他......

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

4 个答案:

答案 0 :(得分:1)

如果在UNICODE模式下打开cmd.exe,可能会有更多运气。使用“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.
}

答案 1 :(得分:1)

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

###

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

答案 2 :(得分:0)

我会用C ++,C#或Java编写这个环境,我确信你可以正确地从路径中获取Unicode字符。使用命令行工具总是不确定,特别是在Cygwin之外。

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

答案 3 :(得分:0)

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