- PR -

Exeの結果取得

投稿者投稿内容
koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 2005-08-02 17:57
いつも参考にさせて頂いています。

OracleのExportユーティリティをVB.NET上から行って、
処理結果を取得したいのですが、以下のソースだと取得できません。
なんとなくデバッグしているとReadToEndのタイミングが早すぎてExportコマンドの出力が出る前に実行されている感じがします。
タイミング的にはWaitForExitが反応する寸前だと思いますが、
この後にReadToEndメソッドを呼んでは駄目ってマニュアルに書いてありました。
どなたか取り方をお教え下さい。

よろしくお願い致します。

Dim results As String
Dim psi As New System.Diagnostics.ProcessStartInfo

Try
psi.FileName = "EXP"
'出力を読み取れるようにする
psi.RedirectStandardInput = False
psi.RedirectStandardOutput = True
psi.UseShellExecute = False
'ウィンドウを表示しないようにする
psi.CreateNoWindow = True
'コマンドラインを指定
psi.Arguments = strExecParam
'起動
Dim p As Process = Process.Start(psi)
'出力を読み取る
strResult = p.StandardOutput.ReadToEnd

'WaitForExitはReadToEndの後である必要がある
'(親プロセス、子プロセスでブロック防止のため)
p.WaitForExit()
Catch ex As Exception
strResult = ex.Message
Finally
psi = Nothing
End Try

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-08-03 10:19
引用:

タイミング的にはWaitForExitが反応する寸前だと思いますが、
この後にReadToEndメソッドを呼んでは駄目ってマニュアルに書いてありました。


終わってから取得になってしまいますからね。
というわけで、Idle 状態になってからじゃダメなんでしょうか...



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
かえで
常連さん
会議室デビュー日: 2004/09/16
投稿数: 38
投稿日時: 2005-08-03 10:33
おはようございます。
直接的な回答ではありません。ごめんなさい。

引用:

OracleのExportユーティリティをVB.NET上から行って、


自分の環境で試した条件ですが、
・Oracle 10g
・Exportに[EXPDP.EXE]を使用
確かにkosekiさんのおっしゃる通りにReadToEnd時には取得結果を得られず、
その後に
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA


と出力されていました。

とりあえず[EXPDP.EXE]を使用する方法であれば、
・実行時の引数でNOLOGFILEというのがありますので、出力されたLOGFILEより結果を取得する。
なんてのができるのかなぁ〜と思いました。

もしくは、ストリームの出力を得る為にスレッドを作成するというのはいかがでしょう?(但し今思いついたので、できるかはわかりません)



koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 2005-08-03 10:34
じゃんぬさん
ご回答、ありがとうございます。

そうですか・・・。
Javaの場合は出来たのに、無理なんですね。

ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-08-03 12:52
標準 "エラー" 出力から取って下さい (By Jitta さん)

# StandardOutput を見落としていた...



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 2005-08-03 13:07
みなさん、ご回答ありがとうございます。

標準エラー出力から取得できました!
StandardError.ReadToEndメソッドは出力が終了するまで待ってくれるんですね。

解決しました。
ありがとうございました。
かえで
常連さん
会議室デビュー日: 2004/09/16
投稿数: 38
投稿日時: 2005-08-03 13:50
引用:

標準 "エラー" 出力から取って下さい (By Jitta さん)



なるほど、その手がありましたか!
全然気づかなかった自分が恥ずかしいです・・・
かえで
常連さん
会議室デビュー日: 2004/09/16
投稿数: 38
投稿日時: 2005-08-03 13:50
引用:

標準 "エラー" 出力から取って下さい (By Jitta さん)



なるほど、その手がありましたか!
全然気づかなかった自分が恥ずかしいです・・・

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