【问题标题】:chcp 65001 and a .bat filechcp 65001 和 .bat 文件
【发布时间】:2015-08-24 12:42:22
【问题描述】:

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

【问题讨论】:

  • 把这四个命令放到一个批处理文件中运行会发生什么? cd folderchcp 65001dir /B /O:Npause
  • foxdrive:cmd窗口打开一小会儿就立即关闭
  • 你试过第4行的pause命令了吗?
  • 是的。它没有停顿。我也试过timeout 5。但是当我将 65001 更改为其他有效编码时,一切正常。
  • 如果您将其粘贴到 cmd 窗口中 - 您会看到什么? chcp 65001 & dir /B /O:N & pause

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


【解决方案1】:

"chcp 65001" 在 Windows 7 之前不起作用。它将导致批处理立即终止。没有变通办法。

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

【讨论】:

【解决方案2】:

使用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

==>

【讨论】:

  • 但是用户并没有使用cmd.exe,他只是运行.bat文件,那么如何在.bat文件中使用/U呢?
  • 您为什么不阅读提供的批处理脚本? cmd /U 使用了两次...他只是运行 .bat 文件 是什么意思?双击它?只需在任务管理器中查看:任何 .bat 脚本始终在 cmd 实例中执行...
  • 如果您想在文件开头添加 BOM,只需在 notepad++ 等记事本中使用相应字符制作模板文件,如 efbbbf.binfeff.bin,然后将其重定向到您的文件中: type efbbbf.bin &gt; "file_with_bom.txt"
【解决方案3】:

仅在 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

【讨论】:

  • 请详细说明。它适用于 Win7SP1x64 英文版。
  • 您是否将其放入 .bat 文件中?我有 Windows Vista 32 位。
  • 是的,它在批处理文件中,否则%% 将不起作用。指责 Vista 是显而易见的选择,它因难以发现的错误和未开发的功能而臭名昭著。
【解决方案4】:

看起来有问题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

【讨论】:

    【解决方案5】:

    在 Windows 2003 上工作:

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

    C:\windows\* - 仅示例

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

    【讨论】:

      【解决方案6】:

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

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

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

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

      现在应该可以了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-24
        • 2017-02-05
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 2021-11-08
        • 1970-01-01
        相关资源
        最近更新 更多