web-dev-qa-db-fra.com

"StandardOut n'a pas été redirigé ou le processus n'a pas encore commencé" lors de la lecture de la sortie de commande de la console en C #

Merci à @ user2526830 pour le code. Sur la base de ce code, j'ai ajouté quelques lignes à mon programme car je veux lire la sortie de la commande SSH. Ci-dessous mon code qui donne une erreur à la ligne while

StandardOut n'a pas été redirigé ou le processus n'a pas encore commencé.

Ce que je veux réaliser, c'est que je veux lire la sortie de ls dans une chaîne.

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

Essayez de définir une redirection de sortie standard avant de démarrer le processus.

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

Il se peut que le processus se soit déjà terminé lorsque vous essayez de lire la sortie (droits à votre commande "exit"). Essayez la version légèrement modifiée ci-dessous où j'ai déplacé votre boucle while après la commande "ls" mais avant la commande "exit".

Il devrait lire correctement la sortie de votre commande "ls", mais malheureusement, il se bloquera très probablement à un moment donné car vous n'obtiendrez jamais EndOfStream sur le StandardOutput. Lorsqu'il n'y a plus rien à lire, ReadLine se bloque jusqu'à ce qu'il puisse lire une autre ligne.

Donc, à moins que vous ne sachiez comment détecter la dernière ligne de la sortie générée par votre commande et sortir de la boucle après l'avoir lue, vous devrez peut-être utiliser un thread séparé pour la lecture ou pour l'écriture.

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