在Windows XP上使用国际字符批量重命名文件

我有一大堆使用我们可爱的瑞典字母åö文件名。 由于各种原因,我现在需要将它们转换为[a-zA-Z]范围。 只是删除这个范围以外的东西是相当容易的。 引起我的麻烦的是我想用oo等replaceö

这是最糟糕的charset麻烦。

我有一组testing文件:

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

我将脚本放在这一行上,将结果input到各种命令中

 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端口来做到这一点,但目前为止没有运气),并且对这些字符进行replace帮助。

你将如何解决这个问题? 我打开任何types的工具,命令行或其他…

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

Solutions Collecting From Web of "在Windows XP上使用国际字符批量重命名文件"

你可以使用这个代码(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表(我用西班牙语文件测试了这个脚本,工作正常)。 您可以评论“移动”行来检查它是否正常工作,并稍后删除注释以进行重命名。

如果以UNICODE模式打开它,则可能在cmd.exe中有更多的运气。 使用“cmd / U”。

其他人则提出使用真正的编程语言。 这很好,特别是如果你有一种语言,你很舒服。 我的C#团队的朋友说,C#3.0(Linq)非常适合像这样快速的小程序。 他大部分时间都不再写批处理文件。

就个人而言,我会选择PowerShell。 这个问题可以在命令行上单独解决。 生病

编辑:这不是一条线,但它不是很多的代码。 此外,它看起来像StackOverflow不喜欢语法“$ _。名称”,并呈现_为&#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环境下编写这些代码,我知道你可以正确地获取Unicode字符。 命令行工具总是不确定的,特别是Cygwin。

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

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