Laden...

Ausgabe einer DOS Shell komplett! umleiten

Erstellt von Lion1984 vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.520 Views
L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 15 Jahren
Ausgabe einer DOS Shell komplett! umleiten

Hallo Forum,

ich hab aktuell das Problem, dass ich automatisiert eine Datei auf einen Server übertragen soll, dies funktioniert auch schon einige Zeit lang.

Aktuell wird einfach bei bestimmten Ereignisse eine Batch Datei aufgerufen, welche anschließend ftp.exe aufruft mit einem Script File.

Wie gesagt, es funktioniert, jedoch nicht immer. Und zwar ist das Problem, dass er manchmal, wenn er ftp aufruft, bereits in ftp sich befindet, und dann schlägt der prozess fehl (weil der aufruf von ftp direkt in ftp selbst nicht funktioniert).

Der Aufruf der Batch daweil klappt immer korregt (zahlreiches debuggen). Nun wollte ich die Batchdatei umgehen, indem ich das Script file selbst schreibe, und anschließend FTP aufrufe, anstatt der Batch Datei. Klappt auch soweit 😃

Nur brauch ich aus div. Gründen das Log, wie man es aus der Console gewöhnt ist(siehe Anhang). In der Batchdatei wurde das mit "ftp -s:file >> test.log" gelöst.

Ich habe bereits versucht, den Standardoutput vom Process abzufangen und diesen zu speichern, nur dieser beinhaltet nicht alle Informationen.

Benutzer (******:(none)): open ****

binary
put **********
put **********
quit

*** = Ersetzen username, Domain und die Files.

Daher meine Frage, ob man das ">>" leicht lösen könnte?

Lion

lg Lion

Gelöschter Account
vor 15 Jahren

dieses ">>" ist auch ncihts anderes wie das umleiten des standardoutputs. wenn du in deinem programm Console.WriteLine verwendest, wird dann dieser dementsprechend umgeleitet. die frage die sich mir allerdings stellt ist: was genau willst du nochmal erreichen? was hast du und was möchtest du genau?

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 15 Jahren

Ich hab ein Windows Programm, dass mit Process automatisch Dateien auf einen FTP transferiert.

Das klappt alles, die Datei landet tatsächlich auf den Server, nur ich brauche diese "protokollierung" (zu sehen im Screenshot), da die anschließend per eMail verwendet wird.

Aktuell habe ich den Standardoutput umgeleitet, wie folgt:

myprocess.Start()
                Dim myStreamReader As System.IO.StreamReader = myprocess.StandardOutput

Die nötigen bool - Werte sind dafür bei myprocess gesetzt:

 myprocess.StartInfo.RedirectStandardOutput = True
        myprocess.StartInfo.UseShellExecute = False

Wenn ich anschliend mit dem Reader arbeite, erhalte ich das oben zitierte Ergebniss, brauchen würde ich aber alles, also von open host bis zum quit (siehe Screenshot)

Lion

€dit: Einen Input gibt es nicht, da ftp.exe selbst per Scriptfile gesteuert wird.

lg Lion

239 Beiträge seit 2008
vor 15 Jahren

Hallo Lion1984,

String output = p.StandardOutput.ReadToEnd()

hast du sicher schon ausprobiert oder? Mit dem funktionierts bei mir immer...

Gruß Michbeck1983

Neulich im Computerkurs:
Mein Computer kennt Else nicht! 😁


[URL]XING-Profil[/URL]

B
293 Beiträge seit 2008
vor 15 Jahren

Mache Applikationen geben ihren Output auch über den StandardErrorStream aus... 😉 Also einfach mal ausprobieren, dass hat mich letztens auch sehr viel nerven gekostet, bis ich dahinter gekommen bin.

String output = p.StandardError.ReadToEnd() 

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 15 Jahren

Hallo,

String output = p.StandardOutput.ReadToEnd() 

ergibt:

Benutzer (*****.at:(none)): open host

binary
put D:***
put D:***
quit

String output = p.StandardError.ReadToEnd() 

ergibt:

Verbindung beendet durch Remotehost.

Also beides leider nicht das, was ich brauche.

Und ja, hatte ich bereits einmal versucht 😃

Lion

lg Lion

B
293 Beiträge seit 2008
vor 15 Jahren

Alternative Frage - Warum machst du es dir so umständlich, indem du erst ein Batch-Script erstellst, etc. und nicht gleich direkt über das .Net-Framework den FTP-Upload regelst?

edit://

Hier nochmal zwei kleine Snippets...

http://dotnet-snippets.de/dns/c-datei-auf-einen-ftp-uploaden-SID494.aspx
http://dotnet-snippets.de/dns/c-ftp-file-upload-mit-buffer-SID886.aspx

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 15 Jahren

Hallo,

Weil ich eben eine protokollierung brauche, mein Wissenstand in allen Ehren, aber wenn ich das von ftp.exe habe, kann ich mir ziemlich sicher sein, dass die Datei tranferiert worden ist.

Würde ich es direkt machen, so müßte ich anschließend checken ob die Datei erfolgreich und komplett transferiert worden ist bzw. macht es ein Unterschied, ob ein komplett funktionierendes Programm (ftp.exe) den Erfolg anzeigt oder ich auf Grund "meines" Transfers, der u.a. auch schief gehen an und trotzdem "erfolgreich" meldet.

Die Idee es selbst zu machen hatte ich zwar auch, sah ich aber nicht zwingend nötig, da das mitgelieferte Windows FTP Programm alles kann, was ich brauche.

Wie gesagt, es funktioniert ja nun ohne Probleme, die Datei landet am Server, ich brauch nur die komplette Ausgabe.

Lion

lg Lion

239 Beiträge seit 2008
vor 15 Jahren

Hallo Lion1984,

hm als Workaround gäbe es doch vielleicht die Möglichkeit, ftp.exe mit dem Parameter -s aufzurufen und den Output somit in eine Datei umzuleiten. Die könntest du dann einfach komplett auslesen. Unter der Voraussetzung, dass ftp.exe auch den gewünschten Output in diese Datei schreibt...

Gruß Michbeck1983

Neulich im Computerkurs:
Mein Computer kennt Else nicht! 😁


[URL]XING-Profil[/URL]

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 15 Jahren

Nun wollte ich die Batchdatei umgehen, indem ich das Script file selbst schreibe, und anschließend FTP aufrufe, anstatt der Batch Datei.

Das mache ich bereits 😃 Ich schreibe mit die notwendige Schritte in eine Datei, und rufe anschließend ftp mit dieser Script Datei auf --> ftp -s:Datei

Aber anschließend findet sich darin auch nicht die gewünschte Ausgabe, sondern eben nur die Schritte, die unternommen werden sollten (open, binary, put, put, quit).

Lion

lg Lion

239 Beiträge seit 2008
vor 15 Jahren

Hallo Lion1984,

hoppla sorry das hab ich dann überlesen. Dann sehe ich ehrlich gesagt nur noch den Weg, die Win32-API-Funktionen stdin/stdout irgendwie auszulesen...

Gruß Michbeck1983

Neulich im Computerkurs:
Mein Computer kennt Else nicht! 😁


[URL]XING-Profil[/URL]

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Lion1984,

wenn >> klappt, sollte auch RedirectStandardOutput klappen.

Wenn das bei dir nicht so ist, dann verwende halt >>. Starte also

cmd /c ftp -s:file >> test.log

per Process.Start.

herbivore

L
Lion1984 Themenstarter:in
770 Beiträge seit 2006
vor 15 Jahren

Hallo Herbivore,

das mit cmd habe ich eben auch um gesetzt und ausgetestet und wollte eben mein Thread dazu schreiben.

Mit RedirecTStandardOutput klappt es nicht bzw. ich krieg es nicht nicht, mit der cmd Version funktioniert es einwandfrei (eben 10 von 10 Versuchen ohne Probleme)

Lion

lg Lion