wake-up-neo.net

chcp 65001 und eine .bat-Datei

Ich habe ein Problem mit dem Befehl chcp 65001 in der Windows Shell.

Ich muss eine Liste von Dateien in einem Ordner erstellen. Also habe ich cmd.exe ausgeführt und getippt

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

Es hat funktioniert, aber ich hatte ein Problem mit speziellen Nicht-ASCII-Zeichen, die sich in einigen Dateinamen befinden. Also habe ich chcp 65001 hinzugefügt.

Alles hat funktioniert, aber wenn ich diese Befehle in eine .bat-Datei packe, funktioniert das Skript nicht.

So

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

generiert die Liste nicht.

und

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

ebenso gut wie

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

generiert die Liste, jedoch mit der Standardkodierung: /.

Alles funktioniert in cmd.exe, aber nicht in .bat-Dateien.

Ich habe das Thema gelesen: stackoverflow.com/questions/2182568/batch-script-is-not-executed-if-chcp-was-called , aber es hat nicht geholfen.

EDIT: Ich habe mein Problem teilweise gelöst und chcp 65001 in chcp 1250 geändert, da alle Zeichen in dieser Kodierung enthalten waren. Aber das beantwortet die Frage eigentlich nicht.

7
maro

Verwenden Sie cmd /U. Siehe http://ss64.com/nt/cmd.html :

Die gebräuchlichsten Textdateien sind ANSI. Verwenden Sie diese Schalter, wenn Sie Den Zeichensatz konvertieren müssen. Diese Optionen wirken sich auf piping oder Aus, wobei in eine Datei umgeleitet wird:

  • /A ANSI-Zeichen ausgeben
  • /U Ausgabe von UNICODE-Zeichen (UCS-2 Little Endian)

Hier ist mein Versuch (natürlich unter cmd /A starten):

@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

Ausgabe . Immer noch ungültige erste Zeile (diese hexadezimale 0D0A), sorry; Verwenden Sie eine andere Methode, um pure Utf-8-Byte-Auftragsmarke zu erhalten:

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

==>
4
JosefZ

"chcp 65001" funktioniert nicht vor Windows 7. Dadurch wird der Stapel sofort beendet. Es gibt keine Umgehung.

Ich habe dies durch direktes Testen von 2003, XP, Vista, 2008, 7, 8 und 10 bestätigt.

2
Gammadyne

es sieht aus wie ein Problem ich traf kürzlich

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
Paul

Nur unter Windows 7 getestet, funktioniert unter Windows Vista möglicherweise nicht.

Anscheinend wirkt sich chcp nicht direkt auf dir aus.

Analysieren Sie die Ausgabe von dir und drucken Sie sie über echo aus:

chcp 65001
>list_of_files.txt (for /f "delims=" %%a in ('dir /B /O:N') do echo %%a)

Hinweis: Die Ausgabedatei enthält nicht UTF-8 Byte Order Mark .

0
wOxxOm

Unter Windows 2003 funktionierte dies:

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

C:\windows\* - nur beispiel

&& chcp 866 - Standard-Codepage und dies ermöglicht das Stapeln

0
SolarWind