2

我有一个名为 rename.txt 的文本文件,如下所示:

34aa85ff2fb46b29fba2283a7b889480306295.flv|بسوی-زیبایی.flv
bb32ca4604217660ab7b6df3938cd0df306294.flv|صدای-تو.flv
b4b802c0182ebfd4fbba9c5ad2ab3904306286.flv|بسوی-حق.flv

当我过去bulk rename utility将左侧的 flv 文件重命名为|右侧的相应文件时,我得到:

批量重命名实用程序 scshot

批量重命名结果

然后我尝试使用批处理文件重命名文件,但在 cmd 中出现同样的问题:

@echo off
for /f "tokens=*" %%a in (rename.txt) do (
  echo %%a
)
pause

命令输出:

命令输出

注意:我可以在 Windows 中手动重命名文件:

预期结果

我怎样才能得到预期的结果?

4

2 回答 2

1

Windows 不使用 UTF-8,它使用 UTF-16LE。对您的输入文件进行转码。

于 2012-09-01T15:07:15.223 回答
1

以下对我有用:

@ECHO OFF
CHCP 65001
FOR /F "tokens=1,2 delims=|" %%a IN (rename.txt) DO (
  RENAME "%%a" "%%b"
)

确保文本文件 ( rename.txt)的开头包含 UTF-8 签名(也称为字节顺序标记,BOM),因为该FOR /F命令会尝试将其视为字符并将其附加到第一个文件的名称中。结果,第一个文件没有被重命名(但所有其他文件都被重命名)。

如果您无法摆脱 BOM,只需在开头放置一个空行,以便 BOM 保留在该行上,而包含名称的其他行保持“干净”。如果您添加该空行并且不更改上述脚本,则在尝试处理空行时会产生错误。这应该不是问题,但如果你想消除它,你可以这样做:

@ECHO OFF
CHCP 65001
FOR /F "tokens=1,2 delims=|" %%a IN (rename.txt) DO (
  IF NOT "%%b" == "" RENAME "%%a" "%%b"
)
于 2012-09-01T18:07:23.747 回答