Comment faire pour enregistrer les sorties STDOUT vers un fichier texte?
J'ai un programme qui utilise une 3ème partie de la ligne de commande outil pour générer des journaux. La 3ème partie génère sa sortie à la sortie standard (STDOUT), dont l'utilisateur doit alors utiliser le " > test.txt"
commande pour enregistrer le fichier.
Mais le programme en quelque sorte génère une certaine quantité de rapports générés, mais pas la totalité du rapport. Ce test a été fait en utilisant la commande
C:\Test\ftk\ripxp>ripxp.exe -r C:\test\ftk\ntuser.dat -d "C:\System Volume\_rest
ore{BB12863B-2C77-46C9-BCDA-1810E52F1089}" -p runmru > C:\test\test05.txt
sur la console de ligne de commande qui fonctionne sur le logiciel qui ne fonctionne que partiellement.
Les erreurs ont été rétréci vers le bas pour soit les arguments de l'erreur ou de l'enregistrement du fichier d'erreur de la partie (streamReader). Par conséquent, l'erreur peut être due à la STDOUT n'est pas correctement enregistré.
Donc quelqu'un peut-il veuillez vous informer sur les codes? Merci!
Les Arguments pour la 3ème partie de l'outil(2008 H. Carvey):
RipXP v.20081001 - CLI RegRipper tool
RipXP [-r Reg hive file] [-p plugin module][-d RP dir][-lgh]
Parse Windows Registry files, using either a single module from the plugins folder.
Then parse all corresponding hive files from the XP Restore Points (extracted from
image) using the same plugin.
-r Reg hive file...Registry hive file to parse
-g ................Guess the hive file (experimental)
-d RP directory....Path to the Restore Point directory
-p plugin module...use only this module
-l ................list all plugins
-h.................Help (print this information)
Ex: C:\>rip -g
C:\>rip -r d:\cases\ntuser.dat -d d:\cases\svi -p userassist
All output goes to STDOUT; use redirection (ie, > or >>) to output to a file.
copyright 2008 H. Carvey
Les Codes:
static void Main(string[] args)
{
//Automatically finds folder that starts with _restore
DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\System Volume\");
DirectoryInfo restoreFolder = directoryInfo.GetDirectories().FirstOrDefault(d => d.Name.StartsWith("_restore"));
//Gets the folder name
String baka = restoreFolder.Name;
if (restoreFolder == null)
throw new DirectoryNotFoundException();
Process process = new Process();
process.StartInfo.FileName = @"C:\test\ftk\ripxp\ripxp.exe";
process.StartInfo.Arguments = @"-r C:\test\ftk\ntuser.dat -d C:\System Volume\" + restoreFolder.Name + " -p runmru";
process.StartInfo.CreateNoWindow = false;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardError = true;
process.Start();
String text = @"-r C:\test\ftk\ntuser.dat -d C:\System Volume\" +restoreFolder.Name + " -p runmru";
Console.WriteLine(baka);
Console.WriteLine(text);
//Strangely the program only outputs the first section "-r C:\test\ftk\ntuser.dat" argument results.....
System.IO.StreamReader reader = process.StandardOutput;
String sRes = reader.ReadToEnd();
StreamWriter SW;
SW = File.CreateText(@"C:\test\test01.txt");
SW.WriteLine(sRes);
SW.Close();
Console.WriteLine("File Created Successfully");
reader.Close();
}
Console.Out.Flush();
après Console.WriteLine(text);
, voyez-vous, à l'ensemble de la ligne, alors?Si une autre Console.WriteLine(texte); il a été placé après la Console..Flush(); ensuite, le texte peut être vu.
OriginalL'auteur JavaNoob | 2010-12-14
Vous devez vous connecter pour publier un commentaire.
Que vous pouvez avoir .NET vous informer que, lorsque le processus a quitté, puis lire le résultat. Parce que, comme detunized mentionné dans sa réponse+commentaire, si vous appelez
reader.ReadToEnd()
avant qu'il ait terminé, vous n'obtiendrez pas tous la sortie. Si vous pensez cela, il est assez évident - les données n'a pas été produit encore, alors comment pouvez-vous vous attendre au lecteur de le lire?En utilisant des événements que vous ne bloquera pas la méthode qui démarre le thread qui peut être très utile si vous avez une application graphique et vous ne voulez pas de geler l'interface utilisateur, tandis que le processus de l'enfant est en cours d'exécution.
Cette méthode sera appelée lorsque le processus est terminé:
Note: peut-être besoin de rediriger StandardError!!!
OriginalL'auteur Isak Savo
Vous êtes en attente pour le processus de l'enfant à la fin? Il semble que vous commencez à lire à sa sortie trop tôt. Il pourrait être fait comme ceci:
Aussi, vous pouvez commencer à recevoir la sortie via les délégués avant la fin. Comme ceci (le délégué est appelé pour chaque ligne de texte):
Il n'a pas d'importance la façon dont il est petit. Lorsque vous appelez
reader.ReadToEnd()
trop tôt, il y aura seulement une petite fraction de l'ensemble de la production.Répétitions pour une autre réponse!
OriginalL'auteur detunized
Le Système.Console de classe a un
Sera
méthode qui devrait faire ce que vous avez besoin.Vous devriez appeler
Console.SetOut(yourTextWriter)
au début de votre programme en exécution.Juste ajouter ceci à la première ligne du programme:
voir mon edit.
Qui redirige votre propre sortie, pas la sortie du processus que vous démarrez.
ouais. Je pense que le problème que l'OP a été d'avoir été avec de rediriger la sortie vers un fichier. Cela fera en sorte qu'il n'a pas besoin de rediriger la sortie lorsque le programme est exécuté.
En fait découvert quelque chose d'intéressant pour cette réponse. Il n'a pas d' en fait, redirection standard. Il redirige l' .net de la Console de sortie de classe. Ce sont deux choses différentes, par exemple, si vous ne printf de code non managé, Console.Sera() n'a aucun effet - printf imprime toujours à la console. (Malheureusement pour moi :))
OriginalL'auteur
Vous devez utiliser le OutputDataReceived événement. Cet article MSDN explique comment c'est fait:
https://msdn.microsoft.com/en-us/library/system.diagnostics.process.outputdatareceived(v=vs. 110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2
À l'intérieur du gestionnaire écrire la sortie dans un fichier à l'aide de la StreamWriter comme:
OriginalL'auteur Igor Krupitsky