Programm lässt sich nicht per Diagnostics.Process starten

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Gloem.

    Programm lässt sich nicht per Diagnostics.Process starten

    Hallo,

    ich habe ein kleines Programm geschrieben welches wiederrum ein anderes Programm aufrufen soll. Der Aufruf aus der Kommandozeile funktioniert ohne Probleme. Wenn ich aber versuche das Programm automatisch aufzurufen bekomme ich einen Fehlercode vom aufgerufenen Programm als ExitCode zurück (1 - Gntrans Handle nicht initialisiert / Konnte EingabeDatei nicht oeffnen / System nicht initialisiert) hat jemand ne Idee was ich falsch mache?

    Aufruf über CMD - ohne Adminrechte - funktioniert
    "c:\Program Files (x86)\LGLN\gntrans_ni\bin64\gntrans_ni.exe" -l NISA7P_P53 -t LSET -2D < "d:\tempASCIItransSource.txt" > "d:\tempASCIItransDestination.txt" 2> "d:\tempASCIItransLog.txt"

    Aufruf aus dem Programm funktioniert nicht

    VB.NET-Quellcode

    1. Dim cmd_Prozess As New System.Diagnostics.Process()
    2. cmd_Prozess.StartInfo.FileName = "c:\Program Files (x86)\LGLN\gntrans_ni\bin64\gntrans_ni.exe"
    3. cmd_Prozess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    4. cmd_Prozess.StartInfo.Arguments = "-l NISA7P_P53 -t " & transformation & " -2D < """ & tempSourceFilename & """ > """ & tempDestinationFilename & """ 2> """ & tempLogFilename & """"
    5. cmd_Prozess.StartInfo.CreateNoWindow = True
    6. cmd_Prozess.Start()
    7. cmd_Prozess.WaitForExit()
    8. MsgBox(cmd_Prozess.ExitCode)
    9. cmd_Prozess.Close()


    Das ist der Inhalt des arguments-String: "-l NISA7P_P53 -t LSET -2D < ""d:\tempASCIItransSource.txt"" > ""d:\tempASCIItransDestination.txt"" 2> ""d:\tempASCIItransLog.txt"""

    Auch wenn ich die mehrfachen Anführungszeichen zur Umgehung von Leerzeichen im Dateiname weglassen funktioniert es leider nicht

    VB.NET-Quellcode

    1. cmd_Prozess.StartInfo.Arguments = "-l NISA7P_P53 -t " & transformation & " -2D < " & tempSourceFilename & " > " & tempDestinationFilename & " 2> " & tempLogFilename


    arguments-String: "-l NISA7P_P53 -t LSET -2D < d:\tempASCIItransSource(23).txt > d:\tempASCIItransDestination.txt 2> d:\tempASCIItransLog.txt"

    Alternativ habe ich versucht den Prozess als cmd.exe zu starten und über "\c ausführbareDatei Parameterliste" die Transformation zu starten aber auch das funktioniert leider nicht.

    Softwareumgebung Windows 10 (64Bit)
    @Gloem Es sieht aus, als ob Du ein 64-Bit-Programm in einem 32-Bit-Verzeichnis starten willst. Ja was denn nun?
    Läuft Dein VB-Programm als x86, x64 oder AnyCPU?
    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!
    Tut mir leid, dass ich mich erst jetzt melde

    Mein Programm, also das aufrufende Tool, ist ein 32 Bit-Kommandozeilentool und liegt auf dem Server

    Das andere Programm stammt nicht von mir und liegt in C:\Program Files (x86)\LGLN\gntrans_ni\bin64 (Standard bei der Installation). Von dem Programm gibt es eine Version mit GUI (64Bit) und ein Kommandozeilentool das ich ansprechen will. Leider kann ich bei letzterem nicht im Taskmanager prüfen ob 32- oder 64-Bit, da das Programm nur sehr kurz läuft.

    Ich habe mein Programm testweise auf 64 und auf anycpu umgestellt aber es gab kein anderes Verhalten

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gloem“ ()

    @Gloem Setz mal die Property cmd_Prozess.StartInfo.WorkingDirectory auf das Verzeichnis der Exe.
    docs.microsoft.com/de-de/dotne…irectory?view=netcore-3.1
    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!
    Leider kein Unterschied

    VB.NET-Quellcode

    1. Dim cmd_Prozess As New System.Diagnostics.Process()
    2. cmd_Prozess.StartInfo.WorkingDirectory = "c:\Program Files (x86)\LGLN\gntrans_ni\bin64"
    3. cmd_Prozess.StartInfo.FileName = "gntrans_ni.exe"
    4. cmd_Prozess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    5. cmd_Prozess.StartInfo.Arguments = "-l NISA7P_P53 -t " & transformation & " -2D < " & tempSourceFilename & " > " & tempDestinationFilename & " 2> " & tempLogFilename
    6. cmd_Prozess.StartInfo.CreateNoWindow = True
    7. cmd_Prozess.Start()
    8. cmd_Prozess.WaitForExit()
    9. MsgBox(cmd_Prozess.ExitCode)
    10. cmd_Prozess.Close()
    @Gloem Erzeug mal eine funktionierende Batch-Datei.
    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!
    Hi.

    Ich würde mir das ProcessInfo als eigene Variable anlegen, das mit Werten versehen und erst dann diese der ProcessStart "komplett" mitgeben.

    Zudem würde ich versuchen die Argumente, "Etappenweise", ausprobieren, um sicherzustellen, das dort kein(e) Fehler vorliegt.

    Sollte das mit den Bit (32/64) das Problem sein, dann halt eine 32er von einer 64er aufrufen lassen, als zwischen(Programm).

    c.u. Joshi aus HH :D
    Hallo,
    tut mir leid, dass ich mich erst jetzt zurückmelde. Im Urlaub hatte ich leider etwas anderes zu tun.

    @Gloem Erzeug mal eine funktionierende Batch-Datei.


    "c:\Program Files (x86)\LGLN\gntrans_ni\bin64\gntrans_ni.exe" -l NISA7P_P53 -t LSET -2D < d:\Aufmass_20200101.100 > d:\Aufmass_20200101.489 2> d:\log1.txt
    "c:\Program Files (x86)\LGLN\gntrans_ni\bin64\gntrans_ni.exe" -l NISA7P_P53 -t LSET -2D < d:\Aufmass_20200102.100 > d:\Aufmass_20200102.489 2> d:\log2.txt

    Per Doppelklick im Explorer getested: Funktioniert. Um etwas robuster zu programmieren müssten die Dateinamen eigentlich noch in Anführungszeichen. Geht in diesem Fall aber auch so.

    Die Variable transformation beinhaltet den Wert LSET. Der Rest sind nur die drei Dateibezeichnungen
    Ich würde mir das ProcessInfo als eigene Variable anlegen

    VB.NET-Quellcode

    1. Dim cmd_Prozess As New System.Diagnostics.Process()
    2. Dim cmd_ProzessInfo As New System.Diagnostics.ProcessStartInfo
    3. With cmd_ProzessInfo
    4. .WorkingDirectory = "c:\Program Files (x86)\LGLN\gntrans_ni\bin64"
    5. .FileName = "gntrans_ni.exe"
    6. .CreateNoWindow = False
    7. .WindowStyle = ProcessWindowStyle.Maximized
    8. .UseShellExecute = True
    9. .Arguments = "-l NISA7P_P53 -t " & transformation & " -2D < " & tempSourceFilename & " > " & tempDestinationFilename
    10. End With
    11. cmd_Prozess.StartInfo = cmd_ProzessInfo
    12. cmd_Prozess.Start()
    13. cmd_Prozess.WaitForExit()
    14. MsgBox(cmd_Prozess.ExitCode) ' Weiterhin 1 für Gntrans Handle nicht initialisiert / Konnte EingabeDatei nicht oeffnen / System nicht initialisiert
    15. cmd_Prozess.Close()


    In Arguments steht: "-l NISA7P_P53 -t LSET -2D < d:\tempASCIItransSource(12).txt > d:\tempASCIItransDestination.txt"

    Mehr Argumente kann ich leider nicht weglassen
    @Gloem Schreib mal in .FileName den Pfad mit dazu.
    Formatiere .Arguments mit String.Format(...) und überzeuge Dich davon, dass da das richtige drin steht.
    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!
    Hi.

    Die Argumente könntest Du ja auch in eine Variable packen, z.B. eine "List(of String)".

    Zudem versuche die Pfade im Argumente-String nochmals mit Anführungszeichen zu setzen, vielleicht hilft das.

    Quellcode

    1. -l NISA7P_P53 -t LSET -2D < "d:\tempASCIItransSource(12).txt" > "d:\tempASCIItransDestination.txt"


    c.u. Joshi aus HH

    VB.NET-Quellcode

    1. Dim cmd_Prozess As New System.Diagnostics.Process()
    2. Dim cmd_ProzessInfo As New System.Diagnostics.ProcessStartInfo
    3. With cmd_ProzessInfo
    4. .WorkingDirectory = "c:\Program Files (x86)\LGLN\gntrans_ni\bin64"
    5. .FileName = "c:\Program Files (x86)\LGLN\gntrans_ni\bin64\gntrans_ni.exe"
    6. .CreateNoWindow = False
    7. .WindowStyle = ProcessWindowStyle.Maximized
    8. .UseShellExecute = True
    9. .Arguments = String.Format("-l NISA7P_P53 -t {0} -2D < {1} > {2}", transformation, tempSourceFilename, tempDestinationFilename)
    10. End With
    11. cmd_Prozess.StartInfo = cmd_ProzessInfo
    12. cmd_Prozess.Start()
    13. cmd_Prozess.WaitForExit()
    14. MsgBox(cmd_Prozess.ExitCode)
    15. cmd_Prozess.Close()


    Ich hab den vierten Parameter weggelassen, der ist optional

    Wert von Arguments:
    NameWertTyp
    Arguments"-l NISA7P_P53 -t LSET -2D < d:\tempASCIItransSource(12).txt > d:\tempASCIItransDestination.txt"String

    Alles ausprobiert. Weiterhin keine Änderung. mit dem Prozessaufruf kann das eigentlich nicht mehr zusammenhängen. Wenn ich das in der Kommandozeile zusammenkopiere läuft das Programm. Einzig die Anführungsstrichen im Filename muss ich noch hinzufügen.
    @Gloem Erzeuge mal eine funktionierende Batch-Datei und starte die mit Process.Start().
    Ich hatte auch mal ein Problem mit dem Starten einer Batch-Datei.
    Dazu musste die Batch als Administrator laufen.
    Füge dazu mal nach With cmd_ProzessInfo die Zeile ein:
    .Verb = "runas"
    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!
    Irgendwie bekomme ich keine Banchrichtigung wenn jemand antwortet

    @Gloem Erzeuge mal eine funktionierende Batch-Datei und starte die mit Process.Start().

    Funktioniert ohne Probleme, auch ohne "runas". Aber ich will ja nicht immer eine Batch-Datei erstellen.

    Aufruf des normalen Prozesses mittels "runas" hilft nicht.

    Gloem schrieb:

    .Arguments = String.Format("-l NISA7P_P53 -t {0} -2D < {1} > {2}", transformation, tempSourceFilename, tempDestinationFilename)
    Die Umleitung von Eingabe und Ausgabe über ​< und ​> wird vom CMD-Interpreter ausgewertet.
    Wenn du so was über die Process-Klasse machen willst, musst du RedirectInput und RedirectOutput verwenden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Nach

    VB.NET-Quellcode

    1. .RedirectStandardInput = True
    2. .RedirectStandardOutput = True

    muste ich auch

    VB.NET-Quellcode

    1. .UseShellExecute = True

    setzen da sonst anscheinend IO-Streams nicht umgeleitet werden können.

    Das Tools lief jahrelang, bis der Hersteller das gntrans_ni.exe umprogrammiert hat. Der aufrufende Syntax war exakt identisch. Lediglich der Dateipfad war anders.

    VB.NET-Quellcode

    1. Dim cmd_Prozess As New System.Diagnostics.Process()
    2. cmd_Prozess.StartInfo.FileName = "c:\Program Files (x86)\LGLN\gntrans_ni\bin64\gntrans_ni.exe"
    3. cmd_Prozess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    4. cmd_Prozess.StartInfo.Arguments = "-l NISA7P_P53 -t " & transformation & " -2D < """ & tempSourceFilename & """ > """ & tempDestinationFilename & """ 2> """ & tempLogFilename & """"
    5. cmd_Prozess.StartInfo.CreateNoWindow = True
    6. cmd_Prozess.Start()
    7. cmd_Prozess.WaitForExit()
    8. MsgBox(cmd_Prozess.ExitCode)
    9. cmd_Prozess.Close()


    Ich werd wohl in den sauren Apfel beißen und temporär eine Batch-Datei erstellen damit das Programm läuft.