首页 / 知识

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

2023-04-15 00:01:00

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

Batch renaming of files with international chars on Windows XP

我有一堆使用我们可爱的瑞典字母的文件名吗? ?和?。
由于各种原因,我现在需要将它们转换为[a-zA-Z]范围。只需删除此范围之外的任何内容,都非常容易。引起我麻烦的是我想更换吗?与,?与o等。

这是最糟糕的字符集麻烦。

我有一组测试文件:

1
2
3
4
5
files\\Copy of New Text Documen ??? t.txt
files\\fofo.txt
files\
ew Text Document.txt
files\\worstcase ??????éé.txt

我将脚本基于此行,将其结果传递到各种命令中

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

奇怪的是,如果我将此结果(即普通的for循环)打印到文件中,则会得到以下输出:

1
2
3
4
5
files\\Copy of New Text Documen ??" t.txt
files\\fofo.txt
files\
ew Text Document.txt
files\\worstcase ??"???.txt

因此,在我的文件名到达其他工具之前,我的文件名发生了一些奇怪的事情(我一直在尝试使用Windows的sed端口从名为GnuWin32的东西进行此操作,但到目前为止还没有运气),并且对这些字符进行替换不会要么帮助。

您将如何解决这个问题?我可以使用任何类型的工具,命令行或其他方式...

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


您可以使用此代码(Python)

重命名国际文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# -*- 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"\
Dir :" + 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)

###

您必须更改编码和字符表(我用西班牙语文件测试了此脚本,并且工作正常)。您可以对" move"行进行注释,以检查其是否正常运行,并在以后删除注释以进行重命名。


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

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

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

编辑:这不是一行,但也不是很多代码。另外,看起来StackOverflow不喜欢语法" $ _。Name",并将_呈现为/ p>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$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.
}

我要编写一个vbscript(WSH)来扫描目录,然后将文件名发送到一个将文件名分解为单个字母的函数,然后对瑞典文字母进行SELECT CASE并将其替换为所需的字母。或者,代替执行该功能可能只是通过一堆REPLACE()函数将其删除,然后将输出重新分配给输入字符串。最后,它将使用新值重命名文件。


我将用C ++,C#或Java编写这些代码-我确定可以从路径中正确获取Unicode字符的环境。使用命令行工具始终是不确定的,尤其是在Cygwin之外。

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


重命名字符文件文件名

最新内容

相关内容

猜你喜欢