コマンドライン引数の書式

タグの編集
投稿者 ねこにゃん  (社会人) 投稿日時 2020/9/9 09:12:26
自作のアプリを、コマンドライン引数をつけて実行できるようにしたいと思います。
渡したい引数は、ID(英数字)と指定ファイルのパス(C:\xxx\yyy\test.txtのような感じ)で、
今後オプションスイッチを追加することを考慮して、引数パラメータの順序は不問にしたいと思います。
こういった場合、コマンドライン引数の書式はどうするのが一般的でしょうか?

例えば、

test.exe id=AAA path="C:\xxx\yyy\test.txt"

のようにして各パラメータを取れそうですが、
今後オプションスイッチを追加することを考慮した場合、
このようなフォーマットで適切なのかどうか、
さらに言えば一般的にはどのように指定しているのか、知りたいです。
投稿者 ねこにゃん  (社会人) 投稿日時 2020/9/9 09:59:54
色々と調べてみると、オプションスイッチの指定が、「-t」や「/t」のようになっているのをよく見かけるので、
今後のオプションスイッチの導入を考慮すると、

test.exe id=AAA path="C:\xxx\yyy\test.txt"

よりも、

test.exe -id=AAA -path="C:\xxx\yyy\test.txt"



test.exe /id=AAA /path="C:\xxx\yyy\test.txt"

のような書式の方が一般的でしょうか?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/9/9 10:17:14
> コマンドライン引数の書式はどうするのが一般的でしょうか?

汎用化された引数解析ライブラリとして、CommandLineParser がしばしば使われます。
https://www.nuget.org/packages/CommandLineParser/
https://qiita.com/skitoy4321/items/742d143b069569014769

同種のライブラリは他にもあります。それぞれのライブラリごとに
コマンドライン構文が多少異なりますので、好みで選択してみてください。

あるいはこういったものに頼らず、
LINQ を併用するなどして自力解析するのも手でしょう。


> 今後オプションスイッチを追加することを考慮して、
> 引数パラメータの順序は不問にしたいと思います。

ID は必須で一つだけ、ファイルも必須で 1 つ以上、という条件なら、
最初の引数は ID 固定、それ以降の引数はファイル群という、
位置指定の引数定義が使いやすいかと思いますが、今後の拡張で
他のオプションも必要とするのなら、パラメータ名を付けるのが良いでしょうね。

位置指定モードと名前指定モードのどちらも使える実装にするのもあり。



> test.exe id=AAA path="C:\xxx\yyy\test.txt"
自分なら、
 test.exe /id:AAA /path:"C:\xxx\yyy\test.txt"
 test.exe -id AAA -path "C:\xxx\yyy\test.txt"
のいずれかにするかな…。

前者は、WScript の WshArguments で使われる引数構文。
後者は、PowerShell の Param で使われる引数構文。


あるいは先の CommandLineParser のルールに合わせる場合、
 test.exe --id AAA --path "C:\xxx\yyy\test.txt"
 test.exe -i AAA -p "C:\xxx\yyy\test.txt"
のような構文になりますね。


このほか、.ini やパラメーターファイルを受け取って処理させる手もあります。

たとえば、Visual Basic コンパイラの VBC.EXE の場合、
参照設定情報を毎度指定するのは煩わしいので、.rsp ファイル
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\vbc.rsp
から読み取る仕様になっています。(-nostdlib オプションで無効化可能)
別ファイルや環境変数に頼る仕様は、個人的には好きではありませんが。

あるいは jq のように、JSON 文字列を引数に取るのも面白いかも。
階層構造や配列データも受け取れるようになり、表現の幅が広がります。


> ID(英数字)と指定ファイルのパス(C:\xxx\yyy\test.txtのような感じ)で、

この条件だけだとしても、いろいろと考慮すべきことがあります。

たとえば、そのファイルは入力用でしょうか、出力用でしょうか。
入力用なら、ワイルドカード(*.txt)などを指定できるのか、とか、
出力用なら、実在するファイルが必要なのか、存在しないファイルを指定できるのかも
定義しておく必要があるでしょう。

また、ファイルが .txt とのことですが、使用される文字コードを
指定するためのパラメーターは無くて良いのか? それとも文字コードは固定なのかとか。

ID パラメーターは省略できるのでしょうか、それとも必須なのでしょうか。
ファイルを複数指定することはできるのでしょうか。

ファイルを複数指定できる場合、指定する ID は一つとなるのか。
それともファイルの数だけ ID が必要となるのか、などなど。
投稿者 ねこにゃん  (社会人) 投稿日時 2020/9/9 11:24:20
ご回答有難うございます。

 test.exe -id AAA -path "C:\xxx\yyy\test.txt"

これで試してみたいと思います。