Probleme mit Aufruf eines Prozesses

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Probleme mit Aufruf eines Prozesses

    Hallo,


    ich möchte aus meinem VB-Programm ein Kommandozeilenprogramm aufrufen. Leider klappt dies aber nicht. Vielleicht kann mir jemand weiterhelfen.

    Hier der Syntax des Kommandozeilenprogramms:

    Quellcode

    1. Befehlszeile:
    2. GNTRANS_NI -t tran [-l land] [Optionen] < stdin > stdout 2> stderr
    3. Argumente:
    4. -t tran : Benutze Transformation tran
    5. -l land : Benutze Bundesland-Kennung land
    6. Optionen:
    7. -llh : Eingabe und Ausgabe von ellipsoidischen Koordinaten
    8. (nur ETRS89)
    9. -st wert : Setze Abbildungsstreifen bzw. -zone auf Wert wert
    10. -? : Ausgabe dieser Online-Hilfe
    11. -q : Deaktiviere Ausgaben auf Fehler-Kanal
    12. -time : Aktiviere Ausgabe der Rechenzeit
    13. -s : Zeige alle Laender und Patches
    14. -2D : Aktiviere Hoehenverschneidung
    15. Transformationen:
    16. ETLS: ETRS89 nach DHDN/GK
    17. LSET: DHDN/GK nach ETRS89
    18. Bundesland-Kennungen:
    19. NISA7P_P53: Transformationsmodell Niedersachsen
    20. Beispiele:
    21. Transformation einer Datei von ETRS89/UTM
    22. nach DHDN/GK:
    23. GNTRANS_NI -l NISA7P_P53 -t ETLS -2D < Eingabe-Datei > Ausgabe-Datei


    In meinem VB-Programm versuche ich den Prozess folgendermaßen zu starten:

    VB.NET-Quellcode

    1. Dim arguments As String = "-l NISA7P_P53 -t " & transformation & " -2D < " & tempSourceFile & " > " & tempDestinationFile & " 2> " & tempLogFile
    2. Try
    3. System.Diagnostics.Process.Start("GNTrans_NI.exe", arguments)
    4. ' Abfangen eines evtl. auftretenden Fehlers
    5. Catch ex As Exception
    6. MsgBox("Fehler beim Transformieren mit GNTrans-NI" & ControlChars.CrLf & ex.Message, MsgBoxStyle.Critical, "Fehler beim Transformieren")
    7. ' Beenden der Methode
    8. Exit Sub
    9. End Try


    In Arguments steht folgende Zeichenkette:
    -l NISA7P_P53 -t LSet -2D < d:\tempASCIItransSource(5).txt > d:\tempASCIItransDestination(1).txt 2> d:\tempASCIItransLog(1).txt

    Die GNTrans_ni.exe ist von jedem Verzeichnis aus direkt aufrufbar, von daher kann der Pfad zur Exe-Datei hier wegfallen. Das Programm benötigt keine Admin-Rechte. Die Dateien ...Destination und ...Log sind auch in beiden Fällen beim Aufruf des Prozesses nicht vorhanden.

    Der Aufruf über die Kommandozeile mit dem Argumentstring die in VB erzeugt wurde funktioniert reibungslos, nur eben aus VB funktioniert der Aufruf nicht. Ich kann auch leider nicht sehen was im von VB erzeugten Kommandozeilenfenster steht da es direkt wieder geschlossen wird.

    Kann mir hier jemand weiterhelfen?
    Wenn du die Argumente, die du hier gepostet hast, 1:1 manuell verwendest, funktioniert es dann?

    Könnte es sein das:

    d:\tempASCIItransSource(5).txt

    vl
    d:\temp\ASCIItransSource_5.txt
    sein sollte? Bin mir gerade nicht so sicher ob Klammern im Dateinamen erlaubt sind...

    Und das "2>" sollte auch ein ">" sein oder?
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    Gloem schrieb:

    d:\tempASCIItransLog(1).txt
    Kann es sein, dass nach d:\temp ein "\" fehlt (insgesamt 3 Mal)?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank für die schnelle Antworten

    Ja, es funktioniert ohne Probleme wenn ich den String aus VB in der Kommandozeile per Copy & Paste einfüge

    Es fehlt kein "\". Die Dateien sind nur temporär und sollen nach dem wiedereinlesen in VB von meinem Programm gelöscht werden.

    Das "2>" muss auch so sein, so erkennt GNTrans_Ni das nun eine Log-Datei kommt, siehe Syntax Befehlszeile

    Kann ich irgendwie beeinflussen, dass das Fenster mit dem Prozess länger geöffnet bleibt

    Gloem schrieb:

    Es fehlt kein "\".
    Das heißt, die (temporären) Daten liegen auf der D-Root.
    Das solltest Du nicht tun, pack sie in ein temporäres Verzeichnis. Ggf. hast Du keine Schreibrechte für ein Root-Verzeichnis, und den Inhalt eines temporären Verzeichnisses kannst Du löschen ohne Rücksicht auf Verluste. In der Root liegt gern mal was von anderen Programmen, was nicht angefasst werden sollte.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das sind zwar temporäre Dateien die jedoch nicht standartmäßig auf D:\ liegen sondern immer in dem Verzeichnis welches dem Programm als Startparameter mit einer Quelldatei mitgegeben wird. Zudem wird auch geprüft ob die Datei schon vorhanden ist (deswegen die "(5)" und "(1)" im Dateiname.

    Aber zurück zum Aufruf des Prozesse: Kann ich irgendwie beeinflussen, dass das Fenster mit dem Prozess länger geöffnet bleibt?
    Indem Du dem Programm dies sagst oder es selbst schreibst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Entweder du schiebst den String der CMD.exe in den Rachen oder du musst die stdin, stdout und stderr -Umleitungen im Process-Objekt entsprechend den vorgesehenen Properties zuweisen.

    Die Umleitung per "<" und ">" werden nur von CMD ausgewertet.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,


    Danke für die Anregung. Ich konnte den Errorstream umleiten um mir in einer MsgBox anzeigen.

    Wie du schon richtig angemerkt hast scheint es an den < und > zu liegen. Im Errorstream steht:

    Quellcode

    1. Exception 1. Unbekannte Option: <


    Und damit wären wir bei meiner nächsten Frage: Wie bekomm ich es hin, das die Zeichen ausgewertet werden?

    Gloem schrieb:

    das die Zeichen ausgewertet werden?
    - geeignet splitten / in sinnvolle Terme zerlegen
    - jeden Term einzeln auswerten
    feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Geeignet splitten und auswerten ist schlecht möglich da das Programm "GNTrans_Ni" nicht von mir stammt. Mit der Anforderung an Parametern muss ich leider leben.

    Hab es aber hinbekommen. In der Antwort von petaod war schon der entscheidende Hinweis. Man muss cmd als Prozess starten und das Programm gntrans_ni plus parameter als Argument übergeben und es funktioniert.

    Dank für die Hilfen und Anregungen
    -l NISA7P_P53 -t LSet -2D < d:\tempASCIItransSource(5).txt > d:\tempASCIItransDestination(1).txt 2> d:\tempASCIItransLog(1).txt

    Parameter: -l NISA7P_P53 -t LSet -2D
    StandardInput: d:\tempASCIItransSource(5).txt ->Read-Stream aufsetzen
    StandardOutput: d:\tempASCIItransDestination(1).txt ->Write-Stream aufsetzen
    StandardError: d:\tempASCIItransLog(1).txt ->Write-Stream aufsetzen

    Wie gesagt: Wenn du die Redirect-Streams nicht selbst handeln willst, dann starte CMD.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --