標準エラーの取得方法
- 題名: 標準エラーの取得方法
- 著者: おさ
- 日時: 2009/06/29 14:14:37
- ID: 24836
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: 標準エラーの取得方法
- 著者: オショウ
- 日時: 2009/06/29 15:01:57
- ID: 24838
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: 標準エラーの取得方法
- 著者: おさ
- 日時: 2009/06/29 15:16:51
- ID: 24840
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: 標準エラーの取得方法
- 著者: オショウ
- 日時: 2009/06/29 16:41:22
- ID: 24844
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: 標準エラーの取得方法
- 著者: オショウ
- 日時: 2009/06/29 16:57:44
- ID: 24845
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[5]: 標準エラーの取得方法
- 著者: おさ
- 日時: 2009/06/29 17:37:18
- ID: 24846
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[6]: 標準エラーの取得方法
- 著者: オショウ
- 日時: 2009/06/29 19:27:38
- ID: 24847
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[7]: 標準エラーの取得方法
- 著者: おさ
- 日時: 2009/06/29 20:01:41
- ID: 24848
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[8]: 標準エラーの取得方法
- 著者: オショウ
- 日時: 2009/06/29 21:51:44
- ID: 24850
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
2009/06/29(Mon) 15:15:39 編集(投稿者)
こんにちは、おさといいます。
現在、SFTPでファイル転送をするという要件があり、
vb.net(.Net 2.0)からPuttyに付属のpsftp.exeをコントロールして
ファイル転送を行う処理を書いています。
標準出力と標準エラーの内容を見ながら、処理を行っていくように
コードを書いているのですが、標準エラーの内容が取得できずに困っております。
以下のようなコードを書いています。
NowOutputに、コンソールへ出力される文字列が入ることを想定しています。
' ----- ここから -----
conn_process = New Process
conn_process.StartInfo.FileName = "psftp.exe"
conn_process.StartInfo.Arguments = "-2"
'出力を読み取れるようにする
conn_process.StartInfo.RedirectStandardInput = True
conn_process.StartInfo.RedirectStandardOutput = True
conn_process.StartInfo.RedirectStandardError = True
conn_process.StartInfo.UseShellExecute = False
'ウィンドウを表示しないようにする
conn_process.StartInfo.CreateNoWindow = True
conn_process.Start()
Dim stdoutWatcher As Thread = New Thread(New ParameterizedThreadStart(AddressOf standardOutputWatchingThread))
stdoutWatcher.Start(conn_process.StandardOutput)
Dim stderrWatcher As Thread = New Thread(New ParameterizedThreadStart(AddressOf standardOutputWatchingThread))
stderrWatcher.Start(conn_process.StandardError)
conn_process.WaitForExit()
' 出力を読み取るメソッド
Private Sub standardOutputWatchingThread(ByVal parameter As Object)
Dim reader As StreamReader = parameter
While Not reader.EndOfStream
Dim c As Char = Chr(reader.Read())
SyncLock NowOutput
NowOutput &= c
processing() ' バッファの内容を見て処理を行う
End SyncLock
End While
reader.Close()
End Sub
' ----- ここまで -----
このとき、NowOutputにて標準出力の内容は読み取れるのですが、
パスワードを間違えたりしたときに出力される「Access denied」など
標準エラーに出力される内容が出てきません。
stderrWatcherに指定するメソッドを標準出力とわけてみましたが、
全く呼ばれていませんでした。
このため標準エラーを標準出力にリダイレクトしてみようと、
StartInfo.Argumentsに「2>&1」を入れてみたりしたのですが、効果は
ありませんでした。(StartInfo.RedirectStandardError = Trueの時点で意味がない?)
コマンドラインから手動で「(psftp.exe 2>&1) > log.txt」とすると、
標準エラーの内容も取れることは確認したのですが…。
なので、vb.net側の呼び出し方が悪いのだろうと思うのですが、
原因が分かりません。
何かまずい所など、指摘して頂けると助かります。
よろしくお願いいたします。