2010-09-23 9 views
0

J'écris le fichier de commandes et l'exécute via le programme C#.Exécution de BatchFile à partir du programme C#

fichier batch Rédaction:

Je vais obtenir le chemin, le nom Executable et arguments de app.config et les écrire dans un fichier batch.

exécution fichier batch:

Une fois que j'écrire le fichier batch je passe le nom du fichier en dessous de la fonction qui exécute le fichier batch pour lance une application.

Problème:

Mon programme va écrire un grand nombre de fichiers de traitement par lots qui sont exécutés immédiatement après chaque fichier est écrit. Je trouve que, parfois, les applications ne sont pas démarrées, ce qui signifie que les fichiers batch ne sont pas exécutés. Je dint même obtenir des messages d'erreur ou des invites pour cet échec de l'exécution du fichier batch.

solution Expected:

Tout problème dans l'exécution du fichier batch, i devrait être en mesure de se connecter ou déclencher une erreur.

Code qui exécute fichier batch:

  System.Diagnostics.ProcessStartInfo procinfo = new System.Diagnostics.ProcessStartInfo("cmd.exe"); 
      procinfo.UseShellExecute = false; 
      procinfo.RedirectStandardError = true; 
      procinfo.RedirectStandardInput = true; 
      procinfo.RedirectStandardOutput = true; 

      System.Diagnostics.Process process = System.Diagnostics.Process.Start(procinfo); 

      System.IO.StreamReader stream = System.IO.File.OpenText(BatchPath + LatestFileName); 
      System.IO.StreamReader sroutput = process.StandardOutput; 
      System.IO.StreamWriter srinput = process.StandardInput; 

      while (stream.Peek() != -1) 
      { 
       srinput.WriteLine(stream.ReadLine()); 
      } 

      Log.Flow_writeToLogFile("Executed .Bat file : " + LatestFileName); 
      stream.Close(); 
      process.Close(); 
      srinput.Close(); 
      sroutput.Close(); 

Très urgent..Help !!!

Répondre

1

Je ne sais pas où votre problème est spécifique, mais je l'ai eu aucun problème avec le code suivant:

using (FileStream file = new FileStream("xyz.cmd", FileMode.Create)) { 
    using (StreamWriter sw = new StreamWriter(file)) { 
     sw.Write("@echo ====================\n"); 
     sw.Close(); 
    } 
} 

Process p = new Process(); 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.FileName = "xyz.cmd"; 
//p.StartInfo.RedirectStandardOutput = true; 
p.Start(); 
//String s = p.StandardOutput.ReadLine(); 
//while (s != null) { 
// MessageBox.Show(s); 
// s = p.StandardOutput.ReadLine(); 
//} 
p.WaitForExit(); 

Il est évident que cela a été un peu abattu aux fins de cacher mon « secret sauce "mais c'est le code actuellement utilisé dans la production sans problèmes.

J'ai une question. Pourquoi n'exécutez-vous pas directement le fichier cmd plutôt que de lancer cmd.exe?

La première chose que je ferais probablement est d'imprimer la valeur BatchPath + LatestFileName pour voir si vous créez des fichiers bizarrement nommés qui empêcheraient cmd.exe de les exécuter.

+0

Je crée un fichier .Bat et l'exécute dans cmd.exe. Dans ce cas, où est le fichier XYZ.cmd? Est-ce que j'ai râté quelque chose ? Une fois que j'écris un batchfile, je le nomme comme "string.Format (" {0: jj-mm-aaaa [HH-mm-ss-fffff]} ", dt);" pour rendre chaque nom de fichier de lot unique. Aide ... Merci. – Anuya

+1

@Anuya, vous exécutez 'cmd.exe' et passez chaque ligne du fichier séquentiel à son entrée standard. Cela semble une manière compliquée de le faire. Comme le fichier de commandes est déjà sur le disque, je le ferais juste au lieu de 'cmd.exe', alors vous n'avez pas à vous soucier d'envoyer les lignes individuelles. Remplacez juste 'xyz.cmd' dans mon code donné avec votre propre nom de fichier de lot (basé sur la date/heure). Mon bit 'using' est juste là pour vous montrer comment j'ai créé le fichier batch. L'exécution réelle commence par le bit 'Process p = ...'. – paxdiablo

Questions connexes