- PR -

[VB.NET] DOSアプリのErrorlevel 取得

投稿者投稿内容
バレル
会議室デビュー日: 2003/12/24
投稿数: 8
投稿日時: 2004-03-06 03:52
お世話になります。

プロセス上のDOSアプリのErrorlevelが取得できません。
因みに当該アプリに関しては、.batファイルからのErrorlevelの取得は
出来ております。

Dim strErrLvl As String = ""
Dim objProcess As System.Diagnostics.Process = Nothing

objProcess = New System.Diagnostics.Process
With objProcess.StartInfo
 .FileName = "hoge.exe"
 .Arguments = "/a /b"
 .RedirectStandardError = True
 .CreateNoWindow = True
 .UseShellExecute = False
 .WindowStyle = ProcessWindowStyle.Hidden
End With
objProcess.Start()
strErrLvl = objProcess.StandardError.ReadToEnd()
objProcess.Close()

[ReadLine()]を使っても、
 Dim objStreamReader As StreamReader = objProcess.StandardError
strErrLvl = objStreamReader.ReadToEnd
としても空文字しか帰ってきません。

以上、お気づきの点があれば宜しくご教示くださいませ。


NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-03-06 08:48
NAL-6295です。

objProcess.ExitCode

で、お受け取りになられては、いかがでしょうか。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-03-06 09:43
ついでに、プロセス終了するまで待ってやらんとだめなんではないでせうか?
# 標準エラー出力と終了コードは全く別物ですよ。
バレル
会議室デビュー日: 2003/12/24
投稿数: 8
投稿日時: 2004-03-06 12:32
NAL-6295様、なちゃ様。
有難うございます。

ExitCodeは正常に受け取れているのですが、残念ながら後処理で必要なのが
標準エラー出力によるリザルトコードなので困っています。

http://dobon.net/vb/dotnet/process/standardoutput.html
↑を参考に、手を入れてみましたが相変わらずです。

Dim strErrLvl As String = ""
Dim objStartInfo As System.Diagnostics.ProcessStartInfo = Nothing

objStartInfo = New System.Diagnostics.ProcessStartInfo
With objStartInfo
.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
.Arguments = "/c hoge.exe /a /b"
.RedirectStandardError = True
.CreateNoWindow = True
.UseShellExecute = False
.WindowStyle = ProcessWindowStyle.Hidden
End With
objProcess = System.Diagnostics.Process.Start(objStartInfo)
strErrLvl = objProcess.StandardError.ReadToEnd()
バレル
会議室デビュー日: 2003/12/24
投稿数: 8
投稿日時: 2004-03-06 15:04
<結果のご報告>
NAL-6295様、なちゃ様。 有難うございました。

手を入れたコードをデバッグしながら、プロセスのメンバの値をあちこち覗い
ていましたら、ふとExitCodeからNAL-6295様のご教示のとおり、標準エラー
から返されるべきリザルトコードが出力されているのに気が付きました。

標準出力を含め、何が原因でプロセスにリダイレクトされないのかはいまだ不明
ですが、最終的に以下のコードで目的を達成することができました。


Dim intExitCode As Integer = 0
Dim objStartInfo As System.Diagnostics.ProcessStartInfo = Nothing

objStartInfo = New System.Diagnostics.ProcessStartInfo
With objStartInfo
.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
.Arguments = "/c hoge.exe /a /b"
.CreateNoWindow = True
.UseShellExecute = False
.WindowStyle = ProcessWindowStyle.Hidden
End With
objProcess = System.Diagnostics.Process.Start(objStartInfo)
objProcess.WaitForExit()
intExitCode = objProcess.ExitCode()

丸一日ハマッテいましたので、本当に有難うございました。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-03-06 15:30
引用:

フッ素さんの書き込み (2004-03-06 15:04) より:
手を入れたコードをデバッグしながら、プロセスのメンバの値をあちこち覗い
ていましたら、ふとExitCodeからNAL-6295様のご教示のとおり、標準エラー
から返されるべきリザルトコードが出力されているのに気が付きました。

標準出力を含め、何が原因でプロセスにリダイレクトされないのかはいまだ不明


まあ、解決されたようですのでいいんですけど、どう見ても終了コードとして結果を返す仕様のプログラムを起動しているようにしか思えないんですが…

> ExitCodeは正常に受け取れているのですが、残念ながら後処理で必要なのが
> 標準エラー出力によるリザルトコードなので困っています。
このプログラムは本当に標準エラー出力に結果を書き出すプログラムなんでしょうか??
架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2004-03-06 16:09
やっぱりまだ勘違いをされているような気が・・・

なちゃさんが仰っているように、標準エラー出力と終了コード(ERRORLEVEL に
設定される値)は全く別物です。

引用:

因みに当該アプリに関しては、.batファイルからのErrorlevelの取得は
出来ております。


をどうやっているのかちょっと気になりますね。。。^^;
バレル
会議室デビュー日: 2003/12/24
投稿数: 8
投稿日時: 2004-03-07 03:03
皆様の御不審はごもっともで・・・・。

>このプログラムは本当に標準エラー出力に結果を書き出すプログラムなんでしょうか??

「F-PROT」という、DOSベースのAnti-Virusエンジンのトリガサービスを作っているのですが、以下は当該アプリのコマンドリファレンスからの抜粋です。
==========================================
The program uses the following exit codes, which can be checked with the
ERRORLEVEL command from a BAT file.

0 - Normal exit - nothing found
1 - Abnormal termination - unrecoverable error. This can mean any of
the following:
Internal error in the program.
DOS version prior to 3.0 was used.
ENGLISH.TX0, SIGN.DEF or MACRO.DEF corrupted or not present.
2 - Selftest failed - program has been modified.
3 - A Boot/File virus infection found.
4 - Virus found in memory.
etc.....。
===========================================
確かにバッチファイルからは「ERRORLEVEL」にリザルトコードが出力されていたので、「標準エラー出力」に固執するあまり、すっかり「exit codes」という言葉を読み飛ばしていました。

<trigger.bat>
@ECHO OFF
C:\F-PROT.EXE <対象ファイルパス> <スイッチ>
ECHO %ERRORLEVEL%
PAUSE

コンソールからは「標準エラー」に出力されるが、プロセスからの呼び出しでは「終了コード」
に出力されるというのが、このアプリ特有の仕様なのか、それとも一般にコンソールアプリという物はそういう仕様になっているのか、あるいは.NET側の私のコーディングに問題があり「標準出力」や「標準エラー」がプロセスにリダイレクトされてないのか、謎は残りましたが,当該アプリはフリーウェアという事で、サポートへの問い合わせも出来かねる為、皆様にはご迷惑をお掛け致しました。

末文ですが、視点を変える事をご教示下さったNAL-6295様をはじめ、皆様に感謝とお礼を申し上げます。

スキルアップ/キャリアアップ(JOB@IT)