chcp 65001 和一个 .bat 文件

问题描述 投票:0回答:8

我在 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
因为所有字符都在这种编码中。但实际上这并没有回答问题。

batch-file command-line cmd windows-vista
8个回答
8
投票

"chcp 65001" 在 Windows 7 之前不起作用。它会导致批处理立即终止。没有解决方法。

我已经通过直接测试2003、XP、Vista、2008、7、8和10验证了这一点


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
),抱歉;使用另一种方法得到pure Utf-8字节序标记:

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

==>

2
投票

在Windows中,确保实际文件的文件格式与控制台(cmd.exe)的codepage相同。常用瑞典语字符 åäö。

在编辑器中(在本例中)Notepad++ 点击“编码 > 转换为 ANSI”

在脚本(批处理文件)中运行与文件相同的代码页(Microsoft 的 1252 ANSI 版本), 文件:

chcp 1252
cd c:\My Folder\Filename_with_åäö-characters.txt

现在它应该工作了。


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 Byte Order Mark.


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 2003 上工作:

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

C:\windows\*
- 只有样品

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


0
投票

您是否尝试更改 cmd 的默认值?
你可以简单地通过创建一个文件 %HOMEPATH%\init.cmd. 来控制代码页。
这会为 cmd.exe 设置默认值。
我的说:

@ECHO OFF
CHCP 65001 > nul

0
投票

当我在我的 bat 文件中使用带有 CHCP 65001 编码的剪辑命令时,我遇到了类似的问题。

Everything works, but strings started from "q" like "q629mg6tzt' give a chinesse characters: 㙱㤲杭琶瑺

我尝试了几个堆栈解决方案,但我只是放弃了丑陋的黑客来防止这种类型的字符串。

在 Windows7 PRO SP1 上发现错误。

© www.soinside.com 2019 - 2024. All rights reserved.