コマンドライン引数の書式
投稿者 ねこにゃん  (社会人)
投稿日時
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"
のような書式の方が一般的でしょうか?
今後のオプションスイッチの導入を考慮すると、
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 が必要となるのか、などなど。
汎用化された引数解析ライブラリとして、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"
これで試してみたいと思います。
test.exe -id AAA -path "C:\xxx\yyy\test.txt"
これで試してみたいと思います。
渡したい引数は、ID(英数字)と指定ファイルのパス(C:\xxx\yyy\test.txtのような感じ)で、
今後オプションスイッチを追加することを考慮して、引数パラメータの順序は不問にしたいと思います。
こういった場合、コマンドライン引数の書式はどうするのが一般的でしょうか?
例えば、
test.exe id=AAA path="C:\xxx\yyy\test.txt"
のようにして各パラメータを取れそうですが、
今後オプションスイッチを追加することを考慮した場合、
このようなフォーマットで適切なのかどうか、
さらに言えば一般的にはどのように指定しているのか、知りたいです。