I have a problem with chcp 65001
command in Windows shell.
I need to generate a list of files in a folder. So I ran cmd.exe, typed
cd folder
"chcp 65001" does not work before Windows 7. It will cause the batch to terminate immediately. There is no work-around.
I have verified this by directly testing 2003, XP, Vista, 2008, 7, 8, and 10.
Tested on Windows 7 only, may not work on Windows Vista.
Apparently chcp
doesn't affect dir
directly.
Parse the output of dir
and print it via echo
:
chcp 65001
>list_of_files.txt (for /f "delims=" %%a in ('dir /B /O:N') do echo %%a)
Note: the output file won't have UTF-8 Byte Order Mark.
it looks like a problem 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
In Windows, make sure that file format of the actual file is same as codepage of the console (cmd.exe). Swedish characters åäö are used commonly.
In editor (in this case) Notepad++ hit "Encode>Convert to ANSI"
In script (batchfile) run same codepage as the file (Microsoft's 1252 ANSI version), File:
chcp 1252
cd c:\My Folder\Filename_with_åäö-characters.txt
Now it should work.
On Windows 2003 worked this:
chcp 65001 && cmd /C dir C:\WINDOWS\* && chcp 866
C:\windows\*
- only sample
&& chcp 866
- default code page and this allow to continue batch
Use cmd /U
. See http://ss64.com/nt/cmd.html:
Most common text files are ANSI, use these switches when you need to convert the character set. These options will affect piping or redirecting to a file:
/A
Output ANSI characters/U
Output UNICODE characters (UCS-2 Little Endian)
Here's my attempt (launch it under cmd /A
, of course):
@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
Output. Still invalid first line (that hexadecimal 0D0A
), sorry; use another method to get pure Utf-8 byte order mark:
==>cmd /A /C D:\bat\SO\UTF8BOM32182619.bat
cpANSI_OoCcSsUu.txt
cpANSI_ÖöÇ窺Üü.txt
escrzyaie.txt
ěščřžýáíé.txt
list_of_files.txt
==>