return aus batch verarbeiten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hallo truespin.

    Kannst du dein Problem etwas genauer, z. B. durch C#-Code, beschreiben?
    Wie rufst du deine Batch-Datei von deinem C#-Programm aus auf?

    Quellcode

    1. {
    2. Process pro= new Process();
    3. pro.OutputDataReceived += new DataReceivedEventHandler(pro_OutputDataReceived);
    4. ProcessStartInfo psi = new ProcessStartInfo("test.cmd");
    5. psi.UseShellExecute = false;
    6. psi.RedirectStandardOutput = true;
    7. psi.RedirectStandardError = true;
    8. psi.RedirectStandardInput = true;
    9. pro.StartInfo = psi;
    10. pro.Start();
    11. pro.BeginOutputReadLine();
    12. pro.WaitForExit();
    13. }
    14. private void pro_OutputDataReceived(object sender, DataReceivedEventArgs e)
    15. {
    16. // e.Data liefert dir den Output als string
    17. }
    Alles anzeigen

    Suchst du soetwas vielleicht ?
    ~ rock on ~
  • guten morgen,

    wenn du lust und zeit hast kannst du mir gerne nochmal helfen^^

    durch ein batchfile befülle ich eine *.txt datei. es stehen nur einzelne kürzel in ihr. sieht dann ungefähr so aus:

    but sut syt rel

    nun möchte ich diese werte als eine art überbersicht in eine windowsform bringen. wie mache ich das am besten? mit einem mehrzeiligem textfeld? oder mit einem grid?
    für mich ist c # immer noch neuland...

    thx, truespin
  • hallo,

    ich habe in einem textfile mehrere jeweils durch einen Zeilenumbruch gekennzeichnete strings.
    diese möchte ich in einer windowsform anzeigen. also entweder in einem mehrzeiligem textfeld, einem grid oder ...
    außerdem muss ich anhand dieser strings entscheidungen treffen (so nach dem motteo: ist string a vorhanden? ja: tu das nein: tu dies).

    die kürzel sollen alle angezeigt werden. nicht einzeln sondern zusammen. also eben als übersicht...

    thx, truespin
  • Dann geh doch her und les die txt Datei zeilenweise aus.
    Den String (also die Zeile) übergibts du an eine Funktion die
    1. den String zu einer listbox mit hinzufügt
    2. die gewünschten Einstellungen vornimmt.

    Damit ist schon einmal der Teil "tu das" erledigt.

    Nun musst du nur noch die Einstellungen für den Fall treffen, dass das Kürzel nicht vorhanden ist. Am einfachsten ist es, wenn du vor dem auslesen der Datei jeweils die "tu dies" Einstellungen vornimmst.

    Es gibt bestimmt auch noch elegantere Möglichkeiten oder auch andere Darstellungsformen.
    Einfach ein bißchen rumspielen und probieren :)
    ~ rock on ~
  • hallo,

    danke nochmal für deine hilfe!

    aber ich glaube ich muss weiter fragen. ich habe mich mittlerweile entschieden doch kein batchfile zu starten, sontern einzelne befehle direkt vom programm aus in der dos box auszuführen.
    ich bekomme es hin das die dos box geöffnet wird. leider schaffe ich es aber nicht einen befehl zu übergeben. kannst du mir vieleicht weiter helfen?

    Quellcode

    1. Process pro = new Process();
    2. pro.OutputDataReceived += new DataReceivedEventHandler(pro_OutputDataReceived);
    3. ProcessStartInfo psi = new ProcessStartInfo("cmd.exe");
    4. psi.UseShellExecute = false;
    5. psi.RedirectStandardOutput = true;
    6. psi.RedirectStandardError = true;
    7. psi.RedirectStandardInput = true;
    8. pro.StartInfo = psi;
    9. pro.Start();
    10. pro.BeginOutputReadLine();
    11. pro.WaitForExit();
    12. psi.CreateNoWindow = true;
    13. psi.Arguments = "call D:\\tools\\svn-win32-1.4.5\\bin\\log\\beep.bat";
    Alles anzeigen




    thx, truespin
  • Hallo truespin.

    Du hast da leider ein paar "kleinen" Fehler:

    1. Nachdem du psi den Prozess StartInfo zuweißt macht es nicht viel Sinn, psi noch einmal zu ändern. Da hast du den Prozess ja schon längst ausgeführt.
    2. Als Prozess startest du NUR die Eingabeaufforderung. Mehr nicht
    3. Unter psi.Arguments versteht man die Argumente, die einem Programm übergeben werden können. Zum Beispiel: programm.exe argument1 argument2
    4. Tipp: damit du nicht immer \\ in einer Pfadangabe schreiben musst, kannst du den String so schreiben: @"D:\tools\svn-win32-1.4.5\bin\log\beep.bat";

    Dein Code müsste also dann so aussehen:

    Quellcode

    1. Process pro = new Process();
    2. pro.OutputDataReceived += new DataReceivedEventHandler(pro_OutputDataReceived);
    3. ProcessStartInfo psi = new ProcessStartInfo(@"D:\tools\svn-win32-1.4.5\bin\log\beep.bat");
    4. psi.UseShellExecute = false;
    5. psi.RedirectStandardOutput = true;
    6. psi.RedirectStandardError = true;
    7. psi.RedirectStandardInput = true;
    8. psi.CreateNoWindow = true;
    9. pro.StartInfo = psi;
    10. pro.Start(); // hier startest du den prozess. in deinem fall die beep.bat
    11. pro.BeginOutputReadLine();
    12. pro.WaitForExit();
    Alles anzeigen

    MfG
    ~ rock on ~
  • guten morgen,

    soweit ist mir das klar...
    in .arguments kann ich doch dann auch gleich befehle für die cmd übergeben oder nicht? genau das ist es was ich machen will.
    mein erster versuch war es alle kommandozeilenbefehle in einer batch auszuführen. das wurde mir dann langsam zu unübersichtlich. nun möchte ich in meinem programm immer nur einzelne befehle per kommantozeile ausführen.

    Quellcode

    1. Process pro = new Process();
    2. pro.OutputDataReceived += new DataReceivedEventHandler(pro_OutputDataReceived);
    3. ProcessStartInfo psi = new ProcessStartInfo("cmd.exe");
    4. psi.UseShellExecute = false;
    5. psi.RedirectStandardOutput = true;
    6. psi.RedirectStandardError = true;
    7. psi.RedirectStandardInput = true;
    8. psi.CreateNoWindow = true;
    9. pro.StartInfo = psi;
    10. pro.Start();
    11. pro.BeginOutputReadLine();
    12. pro.WaitForExit();
    Alles anzeigen


    noch eine frage: dieser code stürzt beim ausführen ab... was ist daran schuld? das WaitForExit()? es wird aber noch nicht mal eine dosbox geöffnet.


    thx truespin
  • Guten Morgen truespin.

    Schau dir doch noch einmal mein Codebeispiel an:

    Quellcode

    1. using System.Diagnostics;
    2. public void meinefunktion()
    3. {
    4. Process pro= new Process();
    5. pro.OutputDataReceived += new DataReceivedEventHandler(pro_OutputDataReceived);
    6. ProcessStartInfo psi = new ProcessStartInfo(@"D:\tools\svn-win32-1.4.5\bin\log\beep.bat");
    7. psi.UseShellExecute = false;
    8. psi.RedirectStandardOutput = true;
    9. psi.RedirectStandardError = true;
    10. psi.RedirectStandardInput = true;
    11. pro.StartInfo = psi;
    12. pro.Start();
    13. pro.BeginOutputReadLine();
    14. pro.WaitForExit();
    15. }
    16. private void pro_OutputDataReceived(object sender, DataReceivedEventArgs e)
    17. {
    18. Console.WriteLine(e.Data);
    19. }
    Alles anzeigen

    In der Zeile 8 legst du mit ProcessStartInfo(...) fest, welchen Befehl/Batch-Datei du ausführen möchtest. Du brauchst dabei NICHT cmd.exe aufrufen. Das erledigt der Prozess für dich. Wenn du also eine Batch-Datei ausführst, startet der Prozess automatisch die Kommandozeile für dich.

    Was für Befehle möchtest du denn ausführen?
    Wenn dir deine Batchdatei aber zu lang/unübersichtlich wird, kannst du doch auch hergehen und mehrere kleine Batch-Dateien (sozusagen Pakete) daraus machen.

    noch eine frage: dieser code stürzt beim ausführen ab... was ist daran schuld? das WaitForExit()? es wird aber noch nicht mal eine dosbox geöffnet.

    Bei deinem Code liegt der Fehler darin, dass du versuchst cmd.exe aufzurufen. Das mag er nicht :)
    ~ rock on ~
  • guten morgen,

    das hat mir leider nicht so viel gebracht.

    ich weiß mitlerweile das es so wie ich es mache mehr oder weniger funktioniert.
    leider habe ich ein problem das ich nicht ganz nachvollziehen kann.

    hier der code:

    Quellcode

    1. Process pro = new Process();
    2. pro.OutputDataReceived += new DataReceivedEventHandler(pro_OutputDataReceived);
    3. ProcessStartInfo psi = new ProcessStartInfo(@"C:\WINNT\system32\cmd.exe");
    4. psi.UseShellExecute = false;
    5. psi.RedirectStandardOutput = true;
    6. psi.RedirectStandardError = true;
    7. psi.RedirectStandardInput = true;
    8. psi.CreateNoWindow = true;
    9. psi.Arguments = "/c \"ipconfig\"";
    10. pro.StartInfo = psi;
    11. pro.Start();
    12. pro.BeginOutputReadLine();
    13. pro.WaitForExit();
    14. void pro_OutputDataReceived(object sender, DataReceivedEventArgs e)
    15. {
    16. try
    17. {
    18. if (e.Data != null && e.Data != "")
    19. {
    20. //txtLabel.Invoke(new EventHandler(delegate { txtLabel.AppendText(e.Data.ToString()); }));
    21. test = e.Data.ToString();
    22. }
    23. }
    24. catch (Exception o)
    25. {
    26. MessageBox.Show(o.Message + o.Source + o.InnerException);
    27. }
    28. }
    Alles anzeigen



    wenn nun das ganze ausführe und nach

    Quellcode

    1. test = e.Data.ToString();
    e in einer MessageBox ausgebe dann funktioniert das auch. wenn ich aber das ganze in einem textfeld ausgeben möchte stürzt das ganze programm ab. leider bringt mir auch der try catch block nichts, da ich da nicht rein falle.

    wenn ihr jemand einen fehler findet darf er ihn nicht behalten sonder bitte mir mitteilen damit ich da weiter machen kann^^


    thx, truespin