課題:任意のWindows固有のコードを実行するために、(PowerShellではなく管理者モードではなく)foo.cmd
Windows cmd.exe
プロンプトから呼び出すことができる単一のスクリプトファイルを記述します...
> .\foo.cmd
Hello Windows!
...だけでなく、一般的なPOSIX準拠する(Linux / OSX)から変更されていない呼び出される(プロンプトシェルbash
、tcsh
またはzsh
任意POSIX固有のコードを実行するために、):
$ chmod a+x foo.cmd
$ ./foo.cmd
Hello POSIX!
...サードパーティのインタプリタ/ツールのインストールまたは作成を必要としません。
私はこれが可能であることを知っていますが、クラフとは(つまり、Windowsでは、「Hello Windows!」の前にstderrまたはstdoutに1行または2行のゴミ/エラーメッセージが出力されます)。
勝利の基準は、(最初の)cruft行の数の最小化、および(2番目の)cruft文字の数の最小化です。
Cruftは、(任意の)ペイロードコードによって生成されないコンソール出力(stdoutまたはstderr)として定義できます。空白行は行数にカウントされます。改行は文字数にはカウントされません。両方のプラットフォームでクラフトスコアを合計する必要があります。cls
そのようなメカニズムを無視して、残骸を一掃しますが、以前の端末出力も消去します。Windowsが@echo off
まだ有効になっていないためにコマンドをエコーする場合は、現在のディレクトリとプロンプトの印刷に費やす文字を除外しましょう。
2番目の基準は、内部のソリューションのシンプルさ/優雅さfoo.cmd
です。「インフラストラクチャ」が任意のペイロードコードに直接関与しない文字として定義されている場合、最初にインフラストラクチャ文字を含む行の数を最小化し、次にインフラストラクチャの総数を最小化します文字。
ファイルにCRLFの行末があるにもかかわらずPOSIX部分が機能する場合の追加の称賛!(最後の部分が可能かどうかわからない。)
私の既存のソリューションは、他の人がチャンスを得たらここに投稿しますが、6行のインフラストラクチャコード(改行を除く52文字)を使用します。5行のクラフを生成し、そのうちの2行は空白で、すべてがWindowsで発生します(改行を除き、これらの行の2つに現れる現在のディレクトリ/プロンプト文字列を除く30文字)。