chcp 65001和一个.bat文件

13

在Windows shell中,我遇到了chcp 65001命令的问题。

我需要列出文件夹中的文件列表。 因此,我打开了cmd.exe,输入了以下命令:

cd folder
dir /B /O:N > list_of_files.txt

它起作用了,但是我在一些文件名中遇到了特殊的、非ASCII字符的问题。所以我添加了chcp 65001

一切都正常工作,但是当我把这些命令放入.bat文件时,脚本就无法运行。

因此,

cd folder
chcp 65001
dir /B /O:N > list_of_files.txt

没有生成清单。

cd folder
chcp 65001 && dir /B /O:N > list_of_files.txt

以及

cd folder
chcp 65001 > nul && dir /B /O:N > list_of_files.txt

生成了列表,但使用的是默认编码 :/。

在 cmd.exe 中一切正常,但在.bat 文件中不行。

我已阅读主题:stackoverflow.com/questions/2182568/batch-script-is-not-executed-if-chcp-was-called,但没有帮助。

编辑: 我部分解决了问题,将 chcp 65001 改为 chcp 1250,因为所有字符都是以该编码表示的。但实际上这并没有回答问题。


foxdrive:命令行窗口打开一会儿然后立即关闭。 - maro
你在第四行尝试使用“pause”命令了吗? - foxidrive
是的,它没有暂停。我也尝试了 timeout 5。但当我将 65001 更改为其他有效的编码时,一切都正常工作。 - maro
如果您将此内容粘贴到cmd窗口中,会看到什么?chcp 65001&dir /B /O:N&pause - foxidrive
我看到编码被更改了,还有一些文件列表以及“按任意键继续”。但如果我加上 > list.txt ,它会生成列表,但没有 Unicode 字符(就像我在问题中举的例子)。 - maro
显示剩余3条评论
7个回答

8
"

在Windows 7之前,使用“chcp 65001”命令是无效的。它会导致批处理文件立即终止,且没有解决方法。

我已经亲自测试了2003、XP、Vista、2008、7、8和10版本的系统,结果证实了以上结论。

"

存在一个针对Windows XP的二进制补丁:http://consolesoft.com/p/cmd-xp-65001-fix/ 但似乎只适用于Windows XP 32位 - Andry

5
使用cmd /U命令。请参见http://ss64.com/nt/cmd.html
大多数普通文本文件都是ANSI编码,当需要转换字符集时,请使用以下开关。这些选项将影响到管道或重定向到文件的操作:
  • /A 输出ANSI字符
  • /U 输出UNICODE字符(UCS-2 Little Endian)
这是我的尝试(当然要在cmd /A下运行):
@ECHO OFF >NUL
SETLOCAL EnableExtensions

:: create a UNICODE file with Byte Order Mark using `wmic` 
chcp 852 >NUL
>list_of_files.txt wmic os get localdatetime

:: store a line with BOM to a variable
:: although FINDSTR does not support UTF-16 files
:: it will read first three bytes at least
for /F "delims=" %%G in ('
    findstr "^" list_of_files.txt
  ') do set "UTF8BOM=%%G"

:: write BOM only* to a file (* echo writes hexadecimal value FFFE0D0A)
:: the `<NUL set /p =text` trick does not work: chokes down leading `FF`  
>list_of_files.txt echo(%UTF8BOM:~0,2%

chcp 65001 >NUL
:: add CRLF in  Unicode (hexadecimal 0D000A00)
>>list_of_files.txt cmd /U /C echo(

:: add result of `dir /B /O:N` in Unicode 
>>list_of_files.txt cmd /U /C dir /B /O:N

:: check the result: still invalid first line, see output
type list_of_files.txt
chcp 852 >NUL

输出。仍然是无效的第一行(十六进制0D0A),很抱歉;请使用其他方法获取纯净的Utf-8字节顺序标记:

==>cmd /A /C D:\bat\SO\UTF8BOM32182619.bat
਍
cpANSI_OoCcSsUu.txt
cpANSI_ÖöÇ窺Üü.txt
escrzyaie.txt
ěščřžýáíé.txt
list_of_files.txt

==>

1
但是用户不使用cmd.exe,他只运行.bat文件,那么我如何在.bat文件中使用/U呢? - maro
1
为什么你不去阅读提供的批处理脚本呢?其中使用了 cmd /U 两次... 而且你所说的 他只是运行了 .bat 文件 是什么意思?双击它?只需要在任务管理器中查看一下:任何 .bat 脚本都是在一个 cmd 实例中执行的... - JosefZ
如果您想在文件开头添加BOM,请创建像efbbbf.binfeff.bin这样的模板文件,并在类似于notepad ++的记事本中使用相应的字符,然后将其重定向到您的文件中:type efbbbf.bin > "file_with_bom.txt" - Andry

2
在Windows中,确保实际文件的文件格式与控制台(cmd.exe)的代码页相同。瑞典字符åäö经常被使用。
在编辑器(此例中为Notepad ++)中点击“编码>转换为ANSI”
在脚本(批处理文件)中运行与文件相同的代码页(Microsoft的1252 ANSI版本), 文件:
chcp 1252
cd c:\My Folder\Filename_with_åäö-characters.txt

现在应该可以工作了。

1

在 Windows 2003 上可以这样操作:

chcp 65001 && cmd /C dir C:\WINDOWS\* && chcp 866

C:\windows\* - 仅为示例

&& chcp 866 - 默认代码页,这允许继续批处理


0

看起来有一个问题我最近遇到了

cd folder
dir /B /O:N > list_of_files.tmp
cmd /U /C type list_of_files.tmp>list_of_files.txt
del list_of_files.tmp

0
仅在Windows 7上测试过,可能无法在Windows Vista上运行。
显然,chcp不会直接影响dir
解析dir的输出并通过echo打印它:
chcp 65001
>list_of_files.txt (for /f "delims=" %%a in ('dir /B /O:N') do echo %%a)

注意:输出文件不会有 UTF-8 字节顺序标记

请详细说明。这在我这里可以在Win7SP1x64英语上运行。 - wOxxOm
你把这个放进了.bat文件里吗?我用的是32位的Windows Vista。 - maro
1
是的,它在批处理文件中,否则 %% 将无法工作。指责 Vista 是显而易见的选择,它以难以发现的错误和不完善的功能而闻名。 - wOxxOm

0

你尝试修改过cmd的默认值吗?
你可以通过创建文件%HOMEPATH%\init.cmd来简单控制代码页。
这将设置cmd.exe的默认值。
我的说法是:

@ECHO OFF
CHCP 65001 > nul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接