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
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?
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
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]
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.
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
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.
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
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]
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
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]
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
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