Problem mit Sendkeys.Send in VB.net

Danchou

Grünschnabel
Tag auch,

Ich hab mein Problem aus Versehen im falschen Unterforum gepostet, darum versuch ichs hier nochmal ;)

Geplant ist folgendes, eine Auswahlbox in diesem Stil:
http://img81.imageshack.us/img81/2760/selectre5.jpg
Bei der Auswahl der versch. Programme sollen Shell Kommandos übergeben werden, welche die jeweiligen Setups mit speziellen Parametern aufrufen (z.B. beim Acrobat Reader "start /wait %systemdrive%\install\Applications\reader\setup.exe /sAll")

Bei Kilck auf den installieren Button soll die cmd.exe geöffnet werden und die Codezeilen (siehe oben in Klammern) übergeben werden.

Ich habs auf zwei Arten versucht, die erste war folgende:
Code:
        inhalt = "ECHO Programme werden installiert {Enter}"
        Areader = "start /wait {%}systemdrive{%}\install\Applications\reader\setup.exe /sAll {Enter}"

        If reader.Checked Then

            inhalt = inhalt & Areader
        End If

        inhalt = inhalt & "{Enter}Exit"


        Shell("cmd", AppWinStyle.NormalFocus)
        SendKeys.Send(inhalt)

Das Ergebnis hiervon waren skurrile Textgebilde (http://img98.imageshack.us/img98/59/errorzp1.jpg)

Jetzt versuch ichs auf die folgende Art und Weise:
Code:
        inhalt = inhalt & "Exit{Enter}"

        Dim shell As New ProcessStartInfo("cmd.exe")

        Process.Start(shell)

Bei der zweiten Methode krieg ich zwar eine Shell, wie ich aber meine Kommandos übergeben kann will mir einfach nicht einfallen bzw. es will mir nicht gelingen. Mit Sendkeys ist das Ergebnis immer ein anderes und eine andere Methode habe ich bis dato nicht gefunden.
Nun die Frage: Wie kann ich meine Shell Kommandos 1:1 übergeben? Mit Sendkeys funktionierts ja anscheinend nicht :) (Editor ist MS Visual Basic '05 Express)
 
Hi

Mit SendKeys solltest du das nicht machen.
Die Process-Klasse hat das Property StartInfo. Da kannst du u.a Argumente für den entsprechenden Prozess angeben.
Wieso machst du aber den Umweg über die CommandShell und rufst nicht direkt das entsprechende Setup mit Process.Start auf?
 
Kann ich denn die Parameter auch in Process.start aufrufen? Ich war mir nicht sicher ob ich da nur das Setup aufrufen kann, deshalb hielt ich die Shell für die beste Variante. Das mit den Arguments habe ich versucht, da öffnete sich aber nur die leere shell.
(Vor allem die /wait Funktion ist wichtig, da ja mehrere Setups ohne Eingabe des Benutzers installiert werden sollen)

MfG
 
Also wenn ich bis dahin käme wo mir die Parameter selber ein Problem bereiten würde mir das ja helfen, ich krieg aber überhaupt keine Ausgabe in die Konsole :)
Hab das jetzt mal nach deinem Vorbild (etwa abgeändert) versucht, die Übergabe von "startInfo.Arguments = inhalt" macht einfach nix. Es wird nur die leere Konsole geöffnet. Langsam bin ich am verzweifeln ^^'
 
Wenn Du den Output umleitest, musst ihn selber aus den Output-Streams abgreifen. Setze StartInfo.RedirectStandardOutput auf false, dann solltest was in der Console sehen...
 
Das hab ich mir gedacht, hab ich in meiner Version auch schon geändert gehabt.

Code:
        Dim schreiben As New ProcessStartInfo("cmd.exe")

        schreiben.Arguments = "cd c:\"
        schreiben.RedirectStandardOutput = False

        Process.Start(schreiben)

Das sollte doch eigentlich schon reichen um etwas auszugeben? Kann es vielleicht an der Vorlage liegen welche ich ausgewählt habe, gibt es da Unterschiede von Windows Anwendung zu Klassenbibliothek usw. was die Ausführung des Codes angeht? Sorry wenn ich mich etwas doof anstelle...
 
Junge Junge, die cmd.exe stellt die Umgebung für Consolen basierte Programme bereit. Was Du da machst, ist nichts weiter als die cmd.exe auszuführen. Kein Wunder dass das kein Output kommt. Das ProcessStartInfo Objekt musst mit dem Pfad des Programms was Du ausführen willst initialisieren. Wenn es eine Consolen-Anwendung ist, wann wird die Console (cmd.exe) von selber geöffnet, nimmt die Benutzereingaben entgegen und gibt den Output das Prozesses aus.

//Edit:
Mit ProcessStartInfo.RedirectStandardInput und ProcessStartInfo.RedirectStandardOutput kannst die Aufgabe der Console selber übernehmen.
 
Zuletzt bearbeitet:
Hab mir jetzt nochmal den ersten Post angeschaut. Wenn Du jetzt unbedingt eine Console als Statusausgabe missbrauchen willst, setzt Du ProcessStartInfo.RedirectStandardInput auf true und schreibst die Zeilen in den Process.StandardInput. Sowas hab ich aber noch nicht versucht, keine Ahnung wie sich das verhält, wenn gleich das nächste Kommando ausführen willst und ob Du das warten musst. Das würde in dem Fall das aufschlüsseln das Outputs erfordern.

Alternativ kannst ja auch ein Batch-File erstellen und das dann ausführen.
 
Zurück