DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

起動時のコマンドライン引数を取得する

ここでは、アプリケーションを起動した時に指定されたコマンドライン引数を取得する方法について説明します。

なお「コマンドライン引数」とは、例えばアプリケーションの実行ファイルのパスが「C:\MyApp\app.exe」で、「C:\MyApp\app.exe /a /b /c」というコマンドラインを実行した時、「/a /b /c」がコマンドライン引数です。

Environment.CommandLine、GetCommandLineArgsを使用する方法

アプリケーション起動時のコマンドライン引数をそのまま取得するには、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メソッドが返す配列は、

  • C:\Program Files\My Application\app.exe
  • /a
  • /b
  • /c /d

となります。

以下に、これらの方法を使ってコマンドライン引数を表示するコードを示します。

VB.NET
コードを隠すコードを選択
'コマンドライン引数を表示する
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
C#
コードを隠すコードを選択
//コマンドライン引数を表示する
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"」というコマンドラインを実行すると、以下のように表示されます。

補足:Visual Studioのデバッグ時にコマンドライン引数を指定したい場合は、プロジェクトのプロパティを表示し、左にあるメニューから「デバッグ」を選択し、「開始オプション」の「コマンドライン引数」に文字列を入力します。

Mainメソッドのパラメータで取得する方法

プログラムのエントリポイントメソッドであるMainメソッドのパラメータによってコマンドライン引数を取得することもできます。この場合、Environment.GetCommandLineArgsメソッドと同じように、文字列の配列として取得できます。

ただしEnvironment.GetCommandLineArgsメソッドとは違い、配列の先頭に実行ファイルのパスが入ることはありません。

なおエントリポイントについて詳しくは、「アプリケーションのエントリポイントを自作する」をご覧ください。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
class Program
{
    static void Main(string[] args)
    {
        if (args.Length == 0)
        {
            Console.WriteLine("コマンドライン引数はありません。");
        }
        else
        {
            foreach (string arg in args)
                Console.WriteLine(arg);
        }
    }
}

出力例は、以下のようになります。

.NET Framework 2.0以降のVB.NETで、My.Application.CommandLineArgsを使用する方法

.NET Framework 2.0以降のVB.NETでは、My.Application.CommandLineArgsプロパティでコマンドライン引数を取得することもできます。この場合は「Mainメソッドのパラメータで取得する方法」と同様に、配列の先頭に実行ファイルのパスが入ることはありません。よって、VB6のCommand関数の代わりに使用することができます。

VB.NET
コードを隠すコードを選択
'コマンドライン引数を列挙する
For Each cmd As String In My.Application.CommandLineArgs
    Console.WriteLine(cmd)
Next
  • 履歴:
  • 2007/2/7 My.Application.CommandLineArgsを使用する方法を追加。
  • 2014/8/19 説明をより詳しく書き直した。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。