chcp 65001和.bat文件

时间:2015-08-24 12:42:23

标签: batch-file command-line cmd windows-vista

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

5 个答案:

答案 0 :(得分:4)

使用cmd /U。见http://ss64.com/nt/cmd.html

  

最常见的文本文件是ANSI,在需要时使用这些开关   转换字符集。这些选项会影响piping or redirecting到文件:

     
      
  • /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 :(得分:2)

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

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

答案 2 :(得分:0)

它看起来像一个问题I recently met

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

答案 3 :(得分:0)

在Windows 2003上工作:

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

C:\windows\* - 仅示例

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

答案 4 :(得分:0)

在Windows中,请确保实际文件的文件格式与控制台(cmd.exe)的代码页相同。瑞典语åäö通常被使用。

在编辑器中(在这种情况下)为记事本++点击“编码>转换为ANSI”

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

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

现在应该可以了。