Codepage für Shell-Erweiterung festlegen

477
Itai

Ich muss eine Shell-Erweiterung für Windows registrieren, die Dateien und Ordner mit Namen in beliebigen Sprachen verarbeiten kann.

Leider scheint Windows seine Shell-Erweiterungen über eine Eingabeaufforderung auszuführen. Daher werden Parameter nicht in Unicode, sondern in der Codepage der Eingabeaufforderung übertragen, die fast immer fehlerhaft ist. Ich weiß, dass Windows über eine API-Funktion GetCommandLineWverfügt. Da das betreffende Programm jedoch in Java geschrieben ist, würde die Verwendung dieses Programms einen plumpen JNA / JNI-Code erforderlich machen, den ich zu vermeiden versuche.

Das Festlegen der Standard-Codepage für das gesamte Betriebssystem scheint keine praktikable Option zu sein, da die einzige Option, die ich gefunden habe, die Einstellung war HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCP, die das System dazu bringen kann, das Booten zu verweigern - ein großes Nein-Nein, wie wir reden Produktionsmaschinen.

Ich habe versucht, meine Shell-Erweiterungen commandauf etwas einzustellen

chcp 65001 & "C:\path\to\java\javaw.exe" -jar "C:\path\to\program\program.jar" "%1" 

oder Variationen mit oder ohne %SystemRoot%, > nuletc., aber alle Ergebnis in den gleichen - wenn die Shell - Erweiterung eine Eingabeaufforderung blinkt Ausführung, aber mein Programm wird nie aufgerufen.

Der nächste Schritt war das Erstellen einer einfachen Batchdatei:

chcp 65001  "C:\path\to\java\javaw.exe" -jar "C:\path\to\program\program.jar" "%1" 

und ändern Sie den Shell-Erweiterungsbefehl in:

"C:\path\to\program\batch.bat" "%1" 

Immer wenn ich versuchte, das auszuführen, würde ich eine Fehlermeldung erhalten

Das System konnte nicht vom angegebenen Gerät lesen

Dies lässt vermuten, dass der Parameter durch die Ausführung der Shell-Erweiterung vor dem Erreichen der Batchdatei durcheinander gebracht wurde. Dann konnte er nicht gespeichert werden.

Meine Frage ist also: Gibt es eine vernünftige Möglichkeit, Windows aufzufordern, Argumente in Unicode (oder einer anderen Codepage) zu übergeben, wenn eine Shell-Erweiterung ausgeführt wird? Oder ist die einzige Option, die native API zu verwenden GetCommandLineW?

0
`" C: \ Pfad \ zu \ java \ javaw.exe "-jar" C: \ Pfad \ zu \ program \ program.jar ""% ~ 1 "` in Ihrem Stapel. Beachten Sie ""% ~ 1 "`. Fügen Sie "echo% 1" nach "chcp" hinzu und fügen Sie am Skriptende "pause" hinzu. JosefZ vor 8 Jahren 1
Ich konnte mit "% ~ 1" keine besseren Ergebnisse erzielen und benutzte schließlich JNA, um die native API aufzurufen ... Itai vor 8 Jahren 0
`chcp` ändert die von der Konsole verwendete Codepage. Dies gilt vermutlich auch für die Art und Weise, wie die Konsole Befehlszeilenargumente übergibt. Offensichtlich übergibt die Konsole keine Argumente in Unicode, da ich Fragezeichen anstelle von Nicht-ASCII-Zeichen erhalten habe. Itai vor 8 Jahren 0
Erzwingen Sie "echo ON" und fügen Sie Ihrem Batch-Tail "echo"% CD% ":"% ~ f0 "="% ~ 1 "& pause" hinzu. Dann [bearbeiten] Sie Ihre Frage und "Kopieren" und "Einfügen" aus dem geöffneten `cmd'-Fenster. JosefZ vor 8 Jahren 0

0 Antworten auf die Frage