Herausforderung : Schreiben Sie eine einzelne Skriptdatei, foo.cmddie über die Vanilla Windows- cmd.exeEingabeaufforderung aufgerufen werden kann (nicht PowerShell, nicht im Administratormodus), um beliebigen Windows-spezifischen Code auszuführen ...
> .\foo.cmd
Hello Windows!
... aber auch aus einem typischen POSIX-konform (Linux / OSX) Shell - Eingabeaufforderung (unverändert aufgerufen werden bash, tcshoder zsh), willkürlichen POSIX-spezifischen Code auszuführen:
$ chmod a+x foo.cmd
$ ./foo.cmd
Hello POSIX!
... ohne Installation oder Erstellung von Dolmetschern / Tools von Drittanbietern.
Ich weiß, dass dies möglich ist, aber mit cruft (dh unter Windows werden ein oder zwei Zeilen Müll / Fehlermeldung vor "Hallo Windows!" Nach stderr oder stdout gedruckt).
Das Gewinnkriterium ist die Minimierung von (erstens) der Anzahl der Cruft-Linien und (zweitens) der Anzahl der Cruft-Zeichen.
Cruft kann als eine beliebige Konsolenausgabe (stdout oder stderr) definiert werden, die nicht vom (beliebigen) Nutzlastcode erzeugt wird. Leerzeilen werden in der Zeilenanzahl gezählt. Zeilenumbrüche werden bei der Zeichenanzahl nicht berücksichtigt. Cruft-Scores sollten auf beiden Plattformen summiert werden. Lassen Sie uns clssolche Mechanismen außer Acht , die die Cruft wegfegen, aber auf Kosten der Ausblendung der vorherigen Terminal-Ausgabe. Wenn Windows Ihre Befehle wiederholt, weil Sie noch nicht gedreht @echo offhaben, schließen wir die Zeichen aus, die beim Drucken des aktuellen Verzeichnisses und der Eingabeaufforderung verwendet werden.
Ein sekundäres Kriterium ist die Einfachheit / Eleganz der darin enthaltenen Lösung foo.cmd: Wenn "Infrastruktur" als ein Zeichen definiert ist, das nicht direkt in den beliebigen Nutzlastcode einbezogen ist, minimieren Sie zuerst die Anzahl der Zeilen, die Infrastrukturzeichen enthalten, und zweitens die Gesamtzahl der Infrastrukturen Zeichen.
Ein großes Lob, wenn der POSIX-Teil trotz der Datei mit CRLF-Zeilenenden funktioniert! (Bin mir nicht sicher, ob der letzte Teil überhaupt möglich ist.)
Meine vorhandene Lösung, die ich hier veröffentlichen werde, sobald andere eine Chance hatten, verwendet 6 Zeilen Infrastrukturcode (52 Zeichen ohne Zeilenumbrüche). Es werden 5 Cruft-Zeilen erzeugt, von denen zwei leer sind und alle unter Windows vorkommen (30 Zeichen ohne Zeilenumbrüche und ohne die aktuelle Verzeichnis- / Eingabeaufforderungszeichenfolge, die in zwei dieser Zeilen angezeigt wird).