.NET TIPS

コマンドライン引数を取得するには?

デジタルアドバンテージ
2003/05/30

 アプリケーションをコマンド・プロンプトから実行する場合には、そのアプリケーションのEXEファイル名に続けて、起動時のパラメータやオプションを指定することができる。また、エクスプローラ上でEXEファイル上にファイルをドロップすることにより、多くのアプリケーションでは、起動時に開くファイルを指定できる。こうして指定されたパラメータやオプションあるいはファイルは、アプリケーションに対して「コマンドライン引数」として渡される。

 コマンドライン引数をセットされたプログラムでは、それを取得して適切に処理しなければならない。C#ではこのコマンドライン引数を、アプリケーションのエントリ・ポイント(プログラムの起動時に呼び出される個所)であるMainメソッドのパラメータとして受け取ることができる。このパラメータの型は文字列の配列である。

 次のサンプル・プログラムではコマンドライン引数で指定された文字列を順に表示する。

// csargs1.cs

using System;

class ShowArgs1 {
  static void Main(string[] args) {

    foreach (string s in args) {
      Console.WriteLine(s);
    }
  }
}

// コンパイル方法:csc csargs1.cs
指定されたコマンドライン引数を表示するC#のサンプル・プログラム(csargs1.cs)

 このサンプル・プログラムの実行例は次のようになる。

サンプル・プログラム(csargs1.cs)の実行結果例

 C言語ではmain関数のパラメータ変数を「argc」と「argv」で記述していたように、C#プログラムではMainメソッドのパラメータ変数は通常「args」と記述する。

 なお、C#ではエントリ・ポイントとして認識されるMainメソッドは、次の4つのシグネチャのいずれかでなければならない。

  • static void Main()
  • static void Main(string[] args)
  • static int Main()
  • static int Main(string[] args)

 C#と同様に、Visual Basic .NET(以下VB.NET)でも文字列の配列をパラメータとするMainメソッドを記述することにより、コマンドライン引数を取得できる。次のサンプル・プログラムは、上記のC#のプログラムをVB.NETで書き直したものだ。

' vbargs.vb

Imports System

Class ShowVBArgs
  Shared Sub Main(ByVal CmdArgs() As String)

    Dim s As String

    For Each s In CmdArgs
      Console.WriteLine(s)
    Next
  End Sub
End Class

' コンパイル方法: vbc vbargs.vb
指定されたコマンドライン引数を表示するVB.NETのサンプル・プログラム(vbargs.vb)

 VB.NETで記述可能なMainメソッド(Mainプロシージャ)は次の4種類である。

  • Shared Sub Main()
  • Shared Sub Main(ByVal CmdArgs() As String)
  • Shared Function Main() As Integer
  • Shared Function Main(ByVal CmdArgs() As String) As Integer

 Mainメソッドはプログラムのエントリ・ポイントであるが、Visual Studio .NETを使用してVB.NETでWindowsアプリケーションを作成する場合、デフォルトではMainメソッドはコードとして現れない。これについては「TIPS:VB.NETでアプリケーション起動時に実行されるフォームを変更するには?」を参照していただきたい。

Environmentクラスによるコマンドライン引数の取得

 .NET Frameworkでは、Mainメソッドのパラメータ以外でもコマンドライン引数を取得する手段が用意されている。これはEnvironmentクラス(System名前空間)のGetCommandLineArgsメソッドを使用する方法だ。このメソッドもコマンドライン引数を文字列の配列として取得する。ただし、こちらの場合では実行したコマンド名が配列の最初の要素に含まれる。

 次のサンプル・プログラムも先ほどと同様に、コマンドライン引数で指定された文字列を順に表示する。

// csargs2.cs

using System;

class ShowArgs2 {
  static void Main() {

    string[] args = Environment.GetCommandLineArgs();

    foreach (string s in args) {
      Console.WriteLine(s);
    }

    Console.WriteLine(Environment.CommandLine);
  }
}

// コンパイル方法:csc csargs2.cs
GetCommandLineArgsメソッドによりコマンドライン引数を取得し表示するサンプル・プログラム(csargs2.cs)

 Environmentクラスにはコマンドライン全体が入ったCommandLineプロパティも用意されている。このサンプル・プログラムの最後の行では、このプロパティの値も表示している。

 さて、サンプル・プログラムの実行例は次のようになる。

サンプル・プログラム(csargs2.cs)の実行結果例
実行結果の最初の行には実行したコマンド名が表示されている。最後の行はCommandLineプロパティの内容。

 表示された実行結果の最初の文字列が、実行したコマンド名(この場合にはcsargs2)となっているのが分かるだろう。通常この最初の文字列はEXEファイルのファイル名となるが、これはコマンドラインで入力した文字列そのままのものだ。つまりプログラムを「c:\c#tips\030cmdargs\csargs2.exe」と入力して実行すれば、この文字列も「c:\c#tips\030cmdargs\csargs2.exe」となる。もし正確なEXEファイルの名前を取得したいのであれば「TIPS:実行ファイルのパスを取得するには?」に示した方法で取得できる。

 以上で解説は終わりだが、Mainメソッドのパラメータで取得できるにもかかわらずこのようなメソッドが用意されているのはなぜだろうか。考えられる理由の1つは、Mainメソッドを持たない.NETの言語があり得るからである。

 例えばJScript .NETでは、次のようにクラスやメソッドの定義なしにいきなりコードを記述することができる。

// jsargs.js

import System;

var args = Environment.GetCommandLineArgs();

var key;

for (key in args) {
  Console.WriteLine(args[key]);
}

// コンパイル方法:jsc jsargs.js
GetCommandLineArgsメソッドによりコマンドライン引数を取得し表示するJScript .NETのサンプル・プログラム(jsargs.js)

 実際にはコンパイラ(JScript .NETのコンパイラはjsc.exe)により、EXEファイルにMainメソッド(とそのメソッドを持つクラス)が作成されるのだが、JScript .NETではそれを明示的に記述することはできない。End of Article

カテゴリ:クラス・ライブラリ 処理対象:コマンドライン引数
カテゴリ:クラス・ライブラリ 処理対象:コンソール・アプリケーション
使用キーワード:Mailメソッド
使用ライブラリ:Environmentクラス(System名前空間)
関連TIPS:VB.NETでアプリケーション起動時に実行されるフォームを変更するには?
関連TIPS:
実行ファイルのパスを取得するには?
 
この記事と関連性の高い別の.NET TIPS
VB.NETでアプリケーション起動時に実行されるフォームを変更するには?
WPF:Mainメソッドを書き変えるには?[C#/VB]
Visual Basic 2005で独自のMainメソッドを使用するには?
起動時にタスクトレイのアイコンのみを表示するには?
プログラムからソース・コードをコンパイルして実行するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間