- - PR -
[VB.NET] DOSアプリのErrorlevel 取得
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 としても空文字しか帰ってきません。 以上、お気づきの点があれば宜しくご教示くださいませ。 | ||||
|
投稿日時: 2004-03-06 08:48
NAL-6295です。
objProcess.ExitCode で、お受け取りになられては、いかがでしょうか。 | ||||
|
投稿日時: 2004-03-06 09:43
ついでに、プロセス終了するまで待ってやらんとだめなんではないでせうか?
# 標準エラー出力と終了コードは全く別物ですよ。 | ||||
|
投稿日時: 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() | ||||
|
投稿日時: 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() 丸一日ハマッテいましたので、本当に有難うございました。 | ||||
|
投稿日時: 2004-03-06 15:30
まあ、解決されたようですのでいいんですけど、どう見ても終了コードとして結果を返す仕様のプログラムを起動しているようにしか思えないんですが… > ExitCodeは正常に受け取れているのですが、残念ながら後処理で必要なのが > 標準エラー出力によるリザルトコードなので困っています。 このプログラムは本当に標準エラー出力に結果を書き出すプログラムなんでしょうか?? | ||||
|
投稿日時: 2004-03-06 16:09
やっぱりまだ勘違いをされているような気が・・・
なちゃさんが仰っているように、標準エラー出力と終了コード(ERRORLEVEL に 設定される値)は全く別物です。
をどうやっているのかちょっと気になりますね。。。^^; | ||||
|
投稿日時: 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様をはじめ、皆様に感謝とお礼を申し上げます。 |