いくつかのパラメーターを受け入れて EXE を実行する Windows CMD スクリプトがあります。最初にいくつかのハードコードされた引数を渡し、次にユーザーからのすべてのパラメーターを渡します。CMD スクリプトは次のようになります。
launcher.exe paramX paramY %*
ユーザーは、次のように Windows シェルから CMD スクリプトを実行します。
launcher.cmd param1 param2 param3 [...]
<
>
私が抱えている問題は、CMD スクリプトのパラメーターにや などのシェル特殊文字が含まれている場合^
、ユーザーはそれぞれの前に 3 つのキャレット^
シェル エスケープ文字を付けて、これらをエスケープする必要があることです。
2 つの例
1) 引数ten>one
を EXE に渡すには、ユーザーは次のように CMD を起動する必要があります。
launcher.cmd ten^^^>one
この理由は、シェルの特殊文字^
と>
がコマンド シェルによって 2 つのレベルで解釈されるためです。最初はコマンド ラインで、2 番目は CMD スクリプト内です。そのため、キャレット^
シェル エスケープ文字によるシェル エスケープを 2 回適用する必要があります。問題は、これがユーザーにとって自明ではなく、見た目が悪いことです。
この例では、より適切な解決策は、引数を二重引用符で囲むことです。ただし、これは、引数にリテラルの二重引用符を含む、より複雑な例ではうまくいきません。
2) 引数"^
を EXE に渡すには、ユーザーは次のように CMD を起動する必要があります。
launcher.cmd "\"^^^^"
私の場合、制御文字、つまりコード ポイント 0x20 から 0x7E を除く、下位 ASCII 文字の任意のシーケンスを含む引数をサポートしたいと考えています。ユーザーが特定のシェル特殊文字をキャレットでエスケープする必要がある例があることを理解しています。ただし、ユーザーが EXE ではなく CMD スクリプトを呼び出しているという理由だけで、これらのケースで毎回3 つのキャレットを使用する必要はありません。
この問題は、CMD スクリプトを同じことを行う EXE に置き換えることで解決できます。ただし、シェルの特殊文字を解釈せずにパラメーターを EXE に渡すように CMD スクリプトを変更する方法はありますか?