web-dev-qa-db-ja.com

.NETでコンソールアプリケーションの終了コードを指定する方法

私は.NETで簡単なコンソールアプリケーションを持っています。これは、より大きなアプリケーションの単なるテスト部分です。私のコンソールアプリケーションの「終了コード」を指定したいのですが。どうやってこれをするの?

438
MrDatabase

3つのオプション:

  • Mainメソッドを宣言してMainを返す場合は、intからそれを返すことができます。
  • あなたは Environment.Exit(code) を呼ぶことができます。
  • プロパティを使って終了コードを設定することができます:Environment.ExitCode = -1;。他に何も戻りコードを設定しない場合、または上記の他のオプションのいずれかを使用している場合は、これが使用されます。

アプリケーション(コンソール、サービス、Webアプリケーションなど)に応じて、さまざまな方法があります。

550
TheSoftwareJedi

戻り値intをカバーする答えに加えて...正気の願い。必要に応じてFlagsを使用して、終了コードを列挙型で定義してください。それはデバッグとメンテナンスをとても簡単にします(そして、おまけとして、あなたはあなたのヘルプスクリーンに簡単に終了コードをプリントアウトすることができます - あなたはそれらのうちの1つを持っている、そうですか?).

enum ExitCode : int {
  Success = 0,
  InvalidLogin = 1,
  InvalidFilename = 2,
  UnknownError = 10
}

int Main(string[] args) {
   return (int)ExitCode.Success;
}
254
Mark Brackett

コンソールアプリケーションから終了コードを返すには、3つの方法があります。

  1. アプリケーションのMainメソッドを変更して、intの代わりにvoidを返し(VB.NetのIntegerの代わりにSubを返す関数)、そのメソッドから終了コードを返すようにします。
  2. Environment.ExitCode プロパティを終了コードに設定します。方法1.が優先されることに注意してください - もしMainメソッドがvoid(VB.NetではSub)以外の何かを返す場合、このプロパティの値は無視されます。
  3. 終了コードを Environment.Exit メソッドに渡します。他の2つの方法とは対照的にこれはすぐにプロセスを終了します。

遵守すべき重要な基準は、0が「成功」を表すということです。

関連トピックについては、列挙型を使用してアプリケーションが返す予定の終了コードを定義することを検討してください。 FlagsAttribute を使用すると、コードの組み合わせを返すことができます。

また、アプリケーションが「コンソールアプリケーション」としてコンパイルされていることを確認してください。

46
Scott Munro

Davidが提案した方法を使うつもりなら、[Flags]属性も見てください。

これにより、enumに対して少し賢い操作を行うことができます。

[Flags]
enum ExitCodes : int
{
  Success = 0,
  SignToolNotInPath = 1,
  AssemblyDirectoryBad = 2,
  PFXFilePathBad = 4,
  PasswordMissing = 8,
  SignFailed = 16,
  UnknownError = 32
}

それから

(ExitCodes.SignFailed | ExitCodes.UnknownError)

16 + 32になります。

43
Aron Tsang
25
albertein
int code = 2;
Environment.Exit( code );
24
palehorse

Mainから適切なコードを返すだけです。

int main(string[] args)
{
      return 0; //or exit code of your choice
}
11
Esteban Araya

メインに無効なリターンシグネチャがある場合はExitCodeを使用します。それ以外の場合は、リターン値で「設定」する必要があります。

Environment.ExitCodeプロパティ

Mainメソッドがvoidを返す場合は、このプロパティを使用して呼び出し元の環境に返される終了コードを設定できます。 Mainがvoidを返さない場合、このプロパティは無視されます。このプロパティの初期値は0です。

11
crashmstr

Scott Munroの 答え の更新として:

  • C#6.0およびVB.NET 14.0(VS 2015)では、 Environment.ExitCode または Environment.Exit(exitCode)のいずれか) は、コンソールアプリケーションからゼロ以外のコードを返すために必要です。 Mainの戻り型を変更しても効果はありません。
  • F#4.0(VS 2015)では、mainエントリポイントの戻り値が尊重されています。
8
Vern DeHaven

列挙オプションは優れていますが、以下のように数値を乗算することで改善できます。

enum ExitCodes : int
{
  Success = 0,
  SignToolNotInPath = 1,
  AssemblyDirectoryBad = 2,
  PFXFilePathBad = 4,
  PasswordMissing = 8,
  SignFailed = 16,
  UnknownError = 32
}

複数のエラーが発生した場合、特定のエラー番号を一緒に追加すると、検出されたエラーの組み合わせを表す一意の番号が得られます。

例えば、6のエラーレベルは、エラー4と2のみからなることができ、12は、エラー4と8のみからなることができ、14は、2、4および8のみからなることができるなどである。

7
David

私の2セント:

ここでシステムエラーコードを見つけることができます: https://msdn.Microsoft.com/ja-jp/library/windows/desktop/ms681382(v=vs.85).aspx

「ファイルが見つかりません」の場合は2、「アクセスが拒否された場合」の場合は5のような一般的なコードがあります。

そして、未知のコードに出くわしたときは、このコマンドを使用してそれが何を意味するのかを調べることができます。

net helpmsg decimal_code

例えば.

ネットhelpmsg 1

戻る

誤った機能

3
Fred Mauroy

このコードを使う

Environment.Exit(0);

何も返さない場合は、intとして0を使用してください。