it-swarm.com.de

Batchdatei-Kodierung

Ich möchte mit Dateinamen umgehen, die seltsame Zeichen enthalten, wie das französische é.

In der Shell funktioniert alles gut:

C:\somedir\>ren -hélice hélice

Ich weiß, wenn ich diese Zeile in eine .bat-Datei stecke, erhalte ich folgendes Ergebnis:

C:\somedir\>ren -hÚlice hÚlice

Sehen ? é wurde durch Ú ersetzt.

Gleiches gilt für die Befehlsausgabe. Wenn ich ein Verzeichnis in der Shell dir habe, ist die Ausgabe in Ordnung. Wenn ich diese Ausgabe in eine Datei umleiten, werden einige Zeichen umgewandelt.

Wie kann ich also cmd.exe sagen, wie das, was in meiner Batch-Datei als é erscheint, wirklich ein é ist und kein Ú oder ein Komma?

Es gibt also keine Möglichkeit, beim Ausführen einer .bat-Datei einen Hinweis auf die Codepage zu geben, in der sie geschrieben wurde?

50
shodanex

Sie müssen die Batchdatei mit der OEM-Kodierung speichern. Die Vorgehensweise hängt von Ihrem Texteditor ab. Die in diesem Fall verwendete Codierung variiert ebenfalls. Für westliche Kulturen ist es normalerweise CP850.

Batch-Dateien und Kodierungen sind wirklich zwei Dinge, die sich nicht besonders mögen. Sie werden feststellen, dass Unicode dort leider auch nicht verwendet werden kann (obwohl Umgebungsvariablen damit umgehen).

Alternativ können Sie die Konsole so einstellen, dass eine andere Codepage verwendet wird:

chcp 1252

sollte den Trick tun. Zumindest hat es hier für mich funktioniert.

Wenn Sie eine Umleitung ausgeben, z. B. mit dir, gelten die gleichen Regeln. Die Codepage des Konsolenfensters wird verwendet. Sie können die /u-Option zu cmd.exe verwenden, um die Unicode-Ausgabeumleitung zu erzwingen, wodurch die resultierenden Dateien in UTF-16 gespeichert werden.

Zu Kodierungen und Codeseiten in cmd.exe im Allgemeinen siehe auch diese Frage:

EDIT: Wie für Ihre Bearbeitung: Nein, cmd geht immer davon aus, dass die Batchdatei in die Standard-Codepage der Konsole geschrieben wird. Sie können jedoch leicht eine chcp am Anfang des Stapels einfügen:

chcp 1252>NUL
ren -hélice hélice

Um dies robuster zu machen, wenn Sie direkt von der Befehlszeile aus verwendet werden, sollten Sie die alte Codepage speichern und anschließend wiederherstellen:

@echo off
for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x
chcp 1252>nul
ren -hélice hélice
chcp %cp%>nul
65
Joey

Ich hatte Probleme damit und hier ist die Lösung, die ich gefunden habe. Suchen Sie die Dezimalzahl des gesuchten Zeichens in Ihrer aktuellen Codepage.

Zum Beispiel bin ich in der Codepage 437 (chcp sagt es Ihnen) und ich möchte ein Gradzeichen. http://en.wikipedia.org/wiki/Code_page_437 sagt mir, dass das Gradzeichen die Nummer 248 ist.

Dann finden Sie das Unicode-Zeichen mit der gleichen Nummer.

Das Unicode-Zeichen bei 248 (U + 00F8) ist.

Wenn Sie das Unicode-Zeichen in Ihr Batch-Skript einfügen, wird es der Konsole als das gewünschte Zeichen angezeigt.

Also meine Batchdatei

echo

druckt

°
1
dconman

Ich habe den folgenden Block erstellt, den ich am Anfang meiner Batchdateien abgelegt habe:

set Filename=%0
IF "%Filename:~-8%" == "-850.bat" GOTO CONVERT_CODEPAGE_END
    rem Converting code page from 1252 to 850.
    rem My editors use 1252, my batch uses 850.
    rem We create a converted -850.bat file, and then launch it.
    set File850=%~n0-850.bat
    PowerShell.exe -Command "get-content %0 | out-file -encoding oem -filepath %File850%"
    call %File850%
    del %File850%
    EXIT /b 0
:CONVERT_CODEPAGE_END
1

Ich interessiere mich für drei Konzepte:

  1. Kodierung der Ausgabekonsole

  2. Interne Kodierung der Befehlszeile (hat sich mit chcp geändert)

  3. .bat Text Encoding

Das einfachste Szenario für mich: Ich werde die ersten beiden in derselben Codierung erwähnen, beispielsweise CP850, und meine .bat-Datei in derselben Codierung speichern (in Notepad ++, Menü Codierung Zeichensätze →) Westeuropäisch OEM 850 ).

Angenommen, jemand gibt mir eine .bat in einer anderen Codierung, sagen Sie CP1252 (in Notepad ++, Menü Encoding * → Zeichensätze Westeuropäisch Windows-1252 )

Dann würde ich die interne Kodierung der Kommandozeile mit chcp 1252 ändern.

Dadurch wird die Kodierung geändert, mit der mit anderen Prozessen gesprochen wird, weder mit dem Eingabegerät noch mit der Ausgabekonsole.

Meine Befehlszeileninstanz wird also effektiv Zeichen im Jahr 1252 über ihren STDOUT-Dateideskriptor senden. Wenn der Konsolentext sie als 850 dekodiert, wird der Text mit dem eingedrückten Text angezeigt (é ist Ú).

Dann ändere ich die Datei wie folgt:

@echo off

Perl -e "use Encode qw/encode decode/;" -e "print encode('cp850', decode('cp1252', \"ren -hlice hlice\n\"));"
ren -hlice hlice

Zuerst schalte ich das Echo aus, damit die Befehle nicht ausgegeben werden, es sei denn, es wird explizit entweder Echo ... oder Perl -e "Drucken ..." ausgeführt.

Dann stelle ich diese Heizplatte jedes Mal, wenn ich etwas ausgeben muss

Perl -e "use Encode qw/encode decode /;" -e "Druckcodierung ('cp850', decodieren ('cp1252', 'ren -hélice hélice\n \")); "

Ich ersetze den eigentlichen Text, den ich hier zeigen werde: ren -hélice hélice.

Und ich könnte auch meine Konsolenkodierung für cp850 und andere Seitencodierung für cp1252 ersetzen müssen.

Und genau darunter stelle ich den gewünschten Befehl.

Ich habe die problematische Zeile in die Ausgabehälfte und die eigentliche Befehlshälfte gebrochen.

  • Die erste versichere ich mir: Das "é" wird mittels Transcodierung als "é" interpretiert. Es ist für alle Ausgabesätze erforderlich, da die Konsole und die Datei unterschiedliche Kodierungen haben.

  • Der zweite Befehl, der echte Befehl (mit @echo aus), wissend, dass wir die gleiche Codierung sowohl von chcp als auch vom .bat-Text haben, reicht aus, um eine korrekte Zeicheninterpretation sicherzustellen.

1
g.cze

Ich hatte polnische Zeichen innerhalb des Codes in R (zB ±, ê, ź, ż usw.) und hatte das Problem beim Ausführen dieses R-Skripts mit der .bat-Datei (in der Ausgabedatei .Rout anstelle dieser Zeichen Es gab Zeichen wie%, &, # usw. und der Code lief nicht bis zum Ende).

Meine Lösung: 

  1. R-Skript mit Codierung speichern: Datei> Speichern mit Codierung> CP1250
  2. Führen Sie die .bat-Datei aus

Es hat für mich funktioniert, aber wenn das Problem weiterhin besteht, versuchen Sie, die anderen Kodierungen zu verwenden.

0
michal