Visual Studio 2019 とC#を用いて、コマンドプロンプト上で動作するコンソールアプリケーションの作り方について解説致します。
コマンドプロンプトにおいて、従来のDOSコマンドには無い「オリジナルのコマンド」を作成するだけではなく、WindowsFormやWPF Windowsアプリと連携させることも可能です。
実用性の高いコマンドを作るために不可欠な引数の受け取り方や、簡単な引数の解析方法なども記載していますので、是非ご活用ください。
コンソールアプリケーションとは
コンソールアプリケーションについて簡単に解説しておきます。
Windows上で動作するアプリケーションには、マウス操作が可能なアプリケーション(Graphical User Interface=GUI)と、DOSプロンプトのコマンドのように文字入力によって動作を行わせるアプリケーション(Character User Interface=CUI)の2通りがあります。
GUIには、開発ツールの違いから複数の種類が存在し、代表的なものとして WindowsFormやWPFがあります。
一方CUIは1種類しかなく、Wisual Studioが進化した今日でも大きな違いはありません。
DOSプロンプト上で動作するものであり、文字の入出力だけという単純な仕様なので、これ以上進化する部分が無いからです。
コンソールアプリケーションの作り方
Visual Studio を使うことで簡単にコンソールアプリケーションの開発が可能です。
ここでは、コンソールアプリケーションの作り方について解説します。
プロジェクトの作り方
まず、Visual Studioを起動したら、「新しいプロジェクトの作成」を選択します。
次に、3つのコンボボックスから、C#、Windows、コンソール を選択すると、
- コンソールアプリケーション
- コンソールアプリ(.NET Framework)
の2行が表示されます。
「コンソールアプリケーション」はWinodws以外のOSでも動作が可能なコンソールアプリケーションを作成できます。
「コンソールアプリ(.NET Framework) は Windows専用のコンソールアプリケーションが作成できます。
両者は使う開発フレームワークが異なっているため、微妙に標準クラスの仕様が変わっている可能性があるので、その点だけご注意ください。
本サイトでは特に記述が無い限り、後者を使うという前提にしています。
次に、プロジェクト名を入力します。
このプロジェクト名がコマンド名になりますので、適切な名前を入力してください。
「作成」をクリックするとプロジェクトが作成され、以下の画面が表示されます。
あとは、プログラミングするのみです。
デバッグ時に引数を渡したい場合
WindowsForm や WPF の場合、プログラム起動後に画面操作により入力値が変更できましたが、コンソールアプリケーションの場合は、プログラム起動時に引数として値を渡す必要があります。
プロジェクト名(下記の例では ConsoleTest)」を右クリックしてプロパティを表示し、「デバッグ」を選択すると、コマンドライン引数(赤枠)を入力することが出来ます。
ここに、起動時に渡したい引数を記述します。
複数の値を渡す場合は、半角スペースで区切ってください。
もし1つの引数に半角スペースを含む値を渡したい場合はダブルクォーテーションで括ります。
例えば、C:¥Program Files を渡す場合、 " C:¥Program Files" と記述します。
コンソールアプリケーションで引数を取得する方法
コンソールアプリケーションは起動時に複数の引数を渡すことができますが、それを受け取るには Main(string[] args) の args を利用します。
引数オプションの取得方法
引数オプションは -s や /s など、特定の文字から始まる値です。
例えば dir コマンドの第1引数はファイル名ですが、その後に続けて /S を指定するとサブディレクトリを含む全てのファイルを出力する動作をします。
また、/AH で隠しファイルを表示したり、 /Q でファイル所有者を表示することもできます。
コンソールアプリケーションに渡された引数は args にて取得できますが、渡された値をオプションとして解釈するか否かはプログラム側で判断しなければなりません。
その場合は args の配列内にオプションが含まれているかを判定する関数を作ると便利です。
例えば、以下のサンプルは、第1引数に args を、第2引数に /s や /t などのオプション文字を渡して、args にそれが含まれていると true 、含まれていないと false を返す関数です。
1 2 3 4 5 6 7 8 9 10 11 |
static public bool FindOption(string[] args,string option) { for(int i = 0;i < args.Length;i ++) { if(args[i].ToLower() == option.ToLower()) { return true; } } return false; } |
もし、/T:100 などのようにコロンで区切られたオプションを取り扱う場合は、次のように Split で引数を分割し、値を取り出すことで対応可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
static public string GetOptionValue(string[] args,string option) { for(int i = 0;i < args.Length;i ++) { var tkn = args[i].Split(':'); if(tkn[0].ToLower() == option.ToLower() && tkn.Length > 0) { return tkn[1]; } } return ""; } |
キーボード入力とコンソール出力
コンソールアプリケーションが起動してから文字列の入力を促したり、処理結果を表示するにはConsoleクラスを用います。
型 | メソッド名 | 内容 |
---|---|---|
ConsoleKeyInfo | ReadKey() | 任意のキーの入力を待つ。 ConsoleKeyInfo.Key で入力された文字コードの取得が可能。 ConsoleKeyInfo.KeyChar で入力された文字の取得が可能。 ReadKey(true) にすると入力された文字を表示しない。 |
string | ReadLine() | Enterが押されるまでを1行として入力を読み込む。 |
void | Write() | 引数で渡された数または値をコンソールに出力する。 Write(123)、Write(”{0}",567) など |
void | WriteLine() | 引数で渡された変数または値を改行付きでコンソールに出力する。 Write(123)、Write(”{0}",567) など |
以下に使い方の簡単なサンプルを載せておきます。
1 2 3 4 5 |
var inp = Console.ReadKey(true); if (inp.Key == ConsoleKey.A) { Console.WriteLine("Key={0}", inp.KeyChar); } |
まとめ
今回はコンソールアプリケーションを作成するために知っておくべき内容として
- Visual Studio によるプロジェクトの作成方法
- デバッグ時の引数の渡し方
- プログラムから渡された引数を取得する方法
- 引数オプション(/s /e 等)の判定方法
- キーボードとコンソール入力の方法
について解説致しました。
コンソールアプリケーションの中では .NET Framework で用意されたクラスが利用できますので、今回の内容を踏まえて、どんどんオリジナルのコマンドを開発して頂ければと思います。