versalzen wrote:Manche Dateinamen werden allerdings überhaupt nicht richtig dargestellt. Ich bekomme in der Shell nur ???????? anstelle der Buchstaben zu sehen. Allerdings wird hier unter Windows auch nur ||||||||||| angezeigt. Ich meine, früher war das mal Griechisch, oder so.
Dann sind das Unicode-Dateinamen. Die kann man wahrscheinlich in Verbindung mit der CMD vergessen. Solche Dateinamen sollte man - sofern möglich - umbenennen, um sie verarbeiten zu können.
Dalai wrote:
wobei der letzte Abschnitt nur notwendig ist, wenn man noch etwas nacharbeiten/ausgeben muss.
Auf was genau beziehst Du Dich, wenn du letzten Abschnitt schreibst?
Der letzte Abschnitt ist das Zurücksetzen der Codepage mit
Code: Select all
if "[%ProgramFiles(x86)%]" == "[]" chcp %oem_cp% > NUL
Beispiel: Macht man nach der Bearbeitung noch eine
pause ins Skript, bekommt man auf einem deutschen Windows keine ordentlichen Umlaute in der Meldung "Drücken Sie eine beliebige Taste". Hierfür mag das nicht weiter dramatisch sein, aber wenn es um die weitere Verarbeitung von Variablen oder sonstwas geht, kann es schon beachtenswert werden.
Desweiteren interessiert mich, was genau
Code: Select all
reg.exe /? | findstr "Version 3.0" > NUL || set skip=2
veranlasst.
Die Variable
skip wird vorher im Skript auf den Wert 4 gesetzt. Dieses schwierig zu lesende Konstrukt sorgt dafür, dass die Variable
skip nur dann auf 2 gesetzt wird, wenn in der Ausgabe von
reg /? der String "Version 3.0"
nicht enthalten ist. Hintergrund ist, dass reg.exe /? unter XP eben jenen Text mit ausgibt, und zwar nicht nur in der Hilfe (/?) sondern immer, also auch bei
reg query & Co, und das sind (inkl. Leerzeile) eben 2 Zeilen mehr als unter Win7.
Ich vermute, es wird einer der beiden folgenden "reg.exe query" angesprungen, wenn "Version 3.0" nicht gefunden wird.
Nein,
reg.exe query wird
immer ausgeführt, nur die Variable
skip hat auf XP einen anderen Wert als auf Win7 (und Vista vermutlich auch).
Woher weiss aber nun Dein Coding, welche Codepage er für die jeweiligen Dateien nehmen soll? Wie funktioniert die Entscheidung?
Ziemlich einfach: aus dem angegebenen Registry-Pfad. In der Registry selbst stehen schon die richtigen Codepages in Abhängigkeit von der Sprache (und ggf. Eingabegebietsschema). Irgendwann vor Jahren hatte ich nämlich auch Probleme mit Umlauten in Batch-Skripten und hatte solange gegoogled, bis ich eine Lösung fand - und die verwende und empfehle ich seitdem (inzwischen etwas angepasst und aufgebohrt).
(Und was könnte möglicherweise schief gehen?)
Ich hoffe nichts

. Im Ernst: bei Unicode-Dateinamen, wie du sie wohl vorliegen hast, ist natürlich Ende, da bringt wohl ein Umschalten der Codepage nichts.
Dalai wrote:Code: Select all
if "[%ProgramFiles(x86)%]" == "[]" chcp %oem_cp% > NUL
Kannst Du mir noch sagen, was passiert, wenn diese letzte Zeile nicht ausgeführt wird? Z.B. wenn ich die Batch vorher mit STRG+C abbreche?
Da sollte gar nichts weiter passieren.
Bleibt dann u.U. irgendetwas verschoben, was die Codepage angeht?
Die Codepage-Änderung gilt ausschließlich für diese eine CMD-Instanz. Alle anderen Programme und auch Windows selbst bleiben völlig unangetastet.
MfG Dalai