You are not logged in.

  • Login

1

Tuesday, November 18th 2008, 8:11am

return aus batch verarbeiten

guten morgen zusammen,

ich rufe in meinem c#-programm ein batchfile auf. nachdem das abgelaufen ist möchte ich gerne einen rückgabewert aus der batch auswerten.
leider habe ich noch nichts genaues gefunden. weiß jemand wie das funktioniert?

thx, truespin

2

Tuesday, November 18th 2008, 2:23pm

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?

C# Quellcode

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

Suchst du soetwas vielleicht ?

3

Tuesday, November 18th 2008, 3:22pm

hallo,

ja! vielen dank!!!


thx, truespin

4

Tuesday, November 18th 2008, 8:04pm

Freut mich, wenn ich dir helfen konnte :)

5

Wednesday, November 19th 2008, 7:56am

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

6

Wednesday, November 19th 2008, 9:47am

Hallo.

Ich weiß leider nicht, was du mit

Quoted

überbersicht
meinst.

Sollen die Kürzel nur angezeigt werden, oder willst du damit arbeiten?
Soll jedes Kürzel für sich angezeigt werden?
oder? oder? ...

7

Wednesday, November 19th 2008, 9:52am

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

8

Wednesday, November 19th 2008, 10:09am

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 :)

9

Friday, November 21st 2008, 9:54am

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?

C# Quellcode

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




thx, truespin

10

Friday, November 21st 2008, 8:30pm

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:

C# Quellcode

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

MfG

11

Tuesday, November 25th 2008, 7:09am

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.

C# Quellcode

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


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

12

Tuesday, November 25th 2008, 8:23am

Guten Morgen truespin.

Schau dir doch noch einmal mein Codebeispiel an:

C# Quellcode

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

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.

Quoted

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 :)

13

Tuesday, November 25th 2008, 8:31am

hallo,

ja ja schon verstanden, aber ich habe im moment nicht mehr vor diese batch datei aufzurufen! deshalb versuche ich die cmd.exe aufzurufen und dann typische cmd befehle zu übergeben... wie z.b. ipconfig, ping,... egal.
mit mehreren batches wirds dann noch unübersichtlicher.


thx, truespin

ps: bitte hab geduld mit mir ^^

14

Tuesday, November 25th 2008, 8:47am

Les dir doch mal folgendes "Mini-"Turtorial durch.
Vielleicht hilft es dir ja weiter :)

15

Wednesday, November 26th 2008, 7:34am

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:

C# Quellcode

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



wenn nun das ganze ausführe und nach

C# 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

16

Wednesday, November 26th 2008, 7:58am

Guten Morgen.

Also das einzige was ich sehe ist, dass du e.Data nicht in einen String konvertieren brauchst weil es schon ein String ist. Aber das sollte nicht das Problem sein.
Sorry :)

17

Wednesday, November 26th 2008, 10:12am

hallo,

ich habs gefunden...

C# Quellcode

1
pro.WaitForExit();


wenn man das raus nimm gehts!
ich denke mir das die Konsole im Hintergrund noch offen war und eben nicht beendet wurde. daher konnte ich auch nicht in den catchblock laufen.

vielen dank für deine hilfe!!
aber ich befürchte ich werde hier noch die ein oder andere frage rein stellen^^


thx, truespin

Similar threads

Social bookmarks