web-dev-qa-db-ja.com

C#でコンソールコマンドの出力を読み取るときに、「StandardOutがリダイレクトされていないか、プロセスがまだ開始されていません」

コードを提供してくれた@ user2526830に感謝します。そのコードに基づいて、SSHコマンドの出力を読みたいので、プログラムに数行を追加しました。以下はwhile行でエラーを発生させる私のコードです

StandardOutがリダイレクトされていないか、プロセスがまだ開始されていません。

私が達成したいのは、lsの出力を文字列に読み取りたいということです。

ProcessStartInfo startinfo = new ProcessStartInfo();
startinfo.FileName = @"f:\plink.exe";
startinfo.Arguments = "-ssh [email protected] -pw abc123";
Process process = new Process();
process.StartInfo = startinfo;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.Start();
process.StandardInput.WriteLine("ls -ltr /opt/*.tmp");
process.StandardInput.WriteLine("exit");

process.StartInfo.RedirectStandardOutput = true;

while (!process.StandardOutput.EndOfStream)
{
    string line = process.StandardOutput.ReadLine();
}

process.WaitForExit();
Console.ReadKey();
16
WoodyStory

プロセスを開始する前に、標準出力のリダイレクトを設定してみてください。

process.StartInfo.RedirectStandardOutput = true;
process.Start();
28
Oscar

出力を読み取ろうとしたときにプロセスがすでに終了している可能性があります(「exit」コマンドによる)。 「ls」コマンドの後、「exit」コマンドの前にwhileループを移動した、以下のわずかに変更されたバージョンを試してください。

「ls」コマンドの出力を正常に読み取る必要がありますが、StandardOutputでEndOfStreamを取得できないため、残念ながらある時点でハングする可能性があります。読み取るものがなくなると、ReadLineは別の行を読み取ることができるようになるまでブロックします。

したがって、コマンドによって生成された出力の最後の行を検出し、それを読み取った後にループから抜け出す方法を知らない限り、読み取りまたは書き込みのいずれかのために別のスレッドを使用する必要がある場合があります。

ProcessStartInfo startinfo = new ProcessStartInfo();
startinfo.FileName = @"f:\plink.exe";
startinfo.Arguments = "-ssh [email protected] -pw abc123";
Process process = new Process();
process.StartInfo = startinfo;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.StandardInput.WriteLine("ls -ltr /opt/*.tmp");

while (!process.StandardOutput.EndOfStream)
{
    string line = process.StandardOutput.ReadLine();
}

process.StandardInput.WriteLine("exit");
process.WaitForExit();
Console.ReadKey();
3
Maciej Grzyb