ここでは、アプリケーションを起動した時に指定されたコマンドライン引数を取得する方法について説明します。
なお「コマンドライン引数」とは、例えばアプリケーションの実行ファイルのパスが「C:\MyApp\app.exe」で、「C:\MyApp\app.exe /a /b /c」というコマンドラインを実行した時、「/a /b /c」がコマンドライン引数です。
アプリケーション起動時のコマンドライン引数をそのまま取得するには、Environment.CommandLineプロパティを使います。また、コマンドライン引数を半角スペースで分割した配列で取得するには、Environment.GetCommandLineArgsメソッドを使います。
CommandLineプロパティの内容はコマンドライン引数だけでなく、先頭に必ず実行ファイルのパスが付きます。よって、コマンドライン引数が指定されていなくても、CommandLineプロパティが空の文字列になることはありません。
同様に、GetCommandLineArgsメソッドも先頭の要素に必ず実行ファイルのパスが入ります。よって、コマンドライン引数が指定されていない場合は、GetCommandLineArgsメソッドが返す配列の要素数は0ではなく、1になります。
補足:MSDNによると、Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional x64 Edition, Windows Server 2003では実行ファイルのパスではなく、名前だけになります。また、Windows 98, Windows MEでは実行ファイルのパスが短いファイル名(8.3形式)になる可能性があります。
GetCommandLineArgsメソッドは、ダブルコーテーション(")で囲まれた文字列は、その中に半角スペースが含まれていたとしても、1つの引数として扱います。
補足:GetCommandLineArgsメソッドでは、ダブルコーテーションの前に連続する円記号が偶数個(2n個)あると、円記号の数は半分(n個)になり、ダブルコーテーションは消えます(例えば、「\\\\"abc」は「\\abc」に)。ダブルコーテーションの前に連続する円記号が奇数個(2n+1個)あると、円記号の数は1つ引いた半分(n個)になり、ダブルコーテーションは残ります(例えば、「\\\\\"abc」は「\\"abc」に)。
補足:文字列を囲む役割ではなく、ダブルコーテーションを文字としてコマンドライン引数に記述したい場合は、ダブルコーテーションの前に円記号(\)を付けます(\")。ダブルコーテーションで囲まれた文字列内でダブルコーテーションを記述する場合は、ダブルコーテーションを2つ連続させる("")こともできるようです。ただしそれ以外の場所に2つ連続したダブルコーテーションが記述されていた場合は、GetCommandLineArgsメソッドはそれを消します(空の引数と解釈され、なかったことになるようです)。
具体的に説明しましょう。例えばアプリケーションの実行ファイルが「C:\Program Files\My Application\app.exe」で、
"C:\Program Files\My Application\app.exe" /a /b "/c /d"
というコマンドラインを実行した時、Environment.CommandLineプロパティは、
"C:\Program Files\My Application\app.exe" /a /b "/c /d"
となります。
また、Environment.GetCommandLineArgsメソッドが返す配列は、
となります。
以下に、これらの方法を使ってコマンドライン引数を表示するコードを示します。
'コマンドライン引数を表示する Console.WriteLine(System.Environment.CommandLine) 'コマンドライン引数を配列で取得する Dim cmds As String() = System.Environment.GetCommandLineArgs() 'コマンドライン引数を列挙する Dim cmd As String For Each cmd In cmds Console.WriteLine(cmd) Next
//コマンドライン引数を表示する Console.WriteLine(System.Environment.CommandLine); //コマンドライン引数を配列で取得する string[] cmds = System.Environment.GetCommandLineArgs(); //コマンドライン引数を列挙する foreach (string cmd in cmds) { Console.WriteLine(cmd); }
このコードが書かれているアプリケーションの実行ファイルが「C:\Program Files\My Application\app.exe」で、「"C:\Program Files\My Application\app.exe" /a /b "/c /d"」というコマンドラインを実行すると、以下のように表示されます。
"C:\Program Files\My Application\app.exe" /a /b "/c /d" C:\Program Files\My Application\app.exe /a /b /c /d
補足:Visual Studioのデバッグ時にコマンドライン引数を指定したい場合は、プロジェクトのプロパティを表示し、左にあるメニューから「デバッグ」を選択し、「開始オプション」の「コマンドライン引数」に文字列を入力します。
プログラムのエントリポイントメソッドであるMainメソッドのパラメータによってコマンドライン引数を取得することもできます。この場合、Environment.GetCommandLineArgsメソッドと同じように、文字列の配列として取得できます。
ただしEnvironment.GetCommandLineArgsメソッドとは違い、配列の先頭に実行ファイルのパスが入ることはありません。
なおエントリポイントについて詳しくは、「アプリケーションのエントリポイントを自作する」をご覧ください。
Module Module1 Sub Main(args As String()) If args.Length = 0 Then Console.WriteLine("コマンドライン引数はありません。") Else Dim arg As String For Each arg In args Console.WriteLine(arg) Next End If End Sub End Module
class Program { static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("コマンドライン引数はありません。"); } else { foreach (string arg in args) Console.WriteLine(arg); } } }
出力例は、以下のようになります。
/a /b /c /d
.NET Framework 2.0以降のVB.NETでは、My.Application.CommandLineArgsプロパティでコマンドライン引数を取得することもできます。この場合は「Mainメソッドのパラメータで取得する方法」と同様に、配列の先頭に実行ファイルのパスが入ることはありません。よって、VB6のCommand関数の代わりに使用することができます。
'コマンドライン引数を列挙する For Each cmd As String In My.Application.CommandLineArgs Console.WriteLine(cmd) Next