.bat Datei im Hintergrund ausführen

  • VB.NET

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von Dodo.

    .bat Datei im Hintergrund ausführen

    Hallo ich hab mal wieder eine Frage an euch;)
    Also ich öffne mit meinem Programm eine Batchdatei und diese öffnet sich ja im Vordergrund(cmd).
    Wie kann ich dieses Fenster im Hintergrund stehen lassen oder halt unsichtbar machen?
    Ich hoff ich wisst was ich mein :rolleyes:

    Danke im voraus
    Was macht der Batch denn?
    Vielleicht kannst du ja die einzelnen schritte in dein Programm einbinden und von dort aus ausführen lassen?

    Edit:
    ich habe vielleicht einen Weg gefunden, aber den werde ich erst Posten, wenn du mir eine gute Begründung nennst warum man das Batchfenster nicht mal minimiert sehen sollte. Akut fallen mir da nur Schweinereien wie Viren oder Trojaner ein ... aber vielleicht denke ich auch zu schlecht von dieser Welt :)
    Da wir mal von "kein Virus" ausgehen ... ;)

    Ich hab was gefunde, wobei der Link zwar tot ist, aber Google das noch gecached hat:


    « H E » email
    posted Tuesday, 14 August 2007
    .Net allows you to run a batch in a hidden console window using System.Diagnostics. You can specify a ProcessStartInfo object (really a strategy pattern), and then run the process. This is useful when trying to integrate to other programs that only provide a command line interface.
    This simple utility method also provides the ability to log the console output to some log file (specified with strLogPath). I have a simple unit test simply as a stub to see how the code is called. In this case, I call the "test.bat" file, passing in a single param "abc", ask the calling code to wait until the batch finishes, and then log it to a given path.


    Code in C# (läßt sich ja leicht anpassen)

    VB.NET-Quellcode

    1. [TestMethod]
    2. public void TestDiagnostics_1()
    3. {
    4. RunHiddenExecutable(@"C:\Temp\test.bat", "abc", true, @"C:\temp\log.txt");
    5. }
    6. public static void RunHiddenExecutable(string strFileName, string strArguments, bool blnWaitForExit, string strLogPath)
    7. {
    8. bool blnOutputLogFile = true;
    9. if (strLogPath == null || strLogPath.Length == 0)
    10. blnOutputLogFile = false;
    11. System.Text.StringBuilder sb = new System.Text.StringBuilder();
    12. try
    13. {
    14. //run in process without showing dialog window:
    15. ProcessStartInfo psi = new ProcessStartInfo();
    16. psi.WindowStyle = ProcessWindowStyle.Hidden;
    17. psi.CreateNoWindow = true; //Need to include this for Executable version (appears not to be needed if UseShellExecute=true)
    18. psi.FileName = strFileName;
    19. psi.Arguments = strArguments;
    20. psi.UseShellExecute = false;
    21. psi.RedirectStandardOutput = true;
    22. Process p = System.Diagnostics.Process.Start(psi);
    23. sb.Append(p.StandardOutput.ReadToEnd());
    24. if (blnWaitForExit)
    25. p.WaitForExit();
    26. }
    27. catch (Exception ex)
    28. {
    29. sb.Append("Exception Occured:\r\n");
    30. sb.Append(ex.ToString());
    31. throw;
    32. }
    33. catch
    34. {
    35. sb.Append("A non-CLSCompliant exception was thrown.");
    36. throw;
    37. }
    38. finally
    39. {
    40. //Implement - log this however you want
    41. //if (blnOutputLogFile)
    42. // Write out file (sb.ToString(), strLogPath);
    43. } //end of try
    44. } //end of method


    Nachtrag: Geht tatsächlich ;)
    Hab's mal umgebaut und bei mir eingebaut.

    VB.NET-Quellcode

    1. Dim o As String = String.Empty
    2. Dim x = VBParadiseTools.ProcessStarter.ExecuteHidden("ping", "192.168.2.1", True, o)
    3. If x IsNot Nothing Then
    4. Debug.Print(x.Message)
    5. End If
    6. Debug.Print(o)

    Schreibt auch schön die Ergebnisse von "Ping 192.168.2.1" in den String. Umlaute klappen noch nicht, aber das dürfte ggfs ja entweder zu verschmerzen oder zu lösen sein.

    Allerdings scheint das mit dem WaitForExit irgendwie nix zu bringen, wenn man den StandardOutput umlenkt. Dann wird offensichtlich immer gewartet, bis der Process beendet ist.

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

    Hoi Renate,
    hier mal eine Lösung aus der Ecke der Administratoren:
    Okay, hier nochmal etwas ausführlicher beschrieben, wies funktioniert:

    Ausgangssituation: Eine .bat oder .cmd soll ausgeführt werden. Diese Dateien sind keine eigenständigen Programme, so daß immer ein Interpreter gestartet wird. Das ist für diese Dateitypen die cmd.exe, die dann sichtbar (auch wenns nur minimiert in der Taskleiste) in deiner Session zu sehen ist.

    Eine Möglichkeit wäre, die Batch Datei zu einer exe zu machen. Diese Konvertierungstools packen quasi den Interpreter und die Batch Datei in eine eigenständige Datei, die dann unsichtbar laufen kann.

    Meine Lösung: Wenn man es schafft, die Batch Datei und die cmd.exe in einer anderen Session auszuführen, als diejenige, die gerade aktiv auf dem Monitor zu sehen ist, dann hat man dasselbe Resultat, sprich die Batch läuft komplett unsichtbar.

    Es geht also nur noch darum, die Batch in eine andere Session zu schieben. Dafür gibts den Befehl "runas".

    Du brauchst auf deinem Rechner nun einen weiteren Benutzer, zusätzlich zu dem, mit dem du unter Windows arbeitest. Nennen wir den mal SilentBenutzer.

    1. Benutzer SilentBenutzer anlegen und nötigen Rechte vergeben
    2. Unter Start\Ausführen eingeben: runas /user:SilentBenutzer "DeineBatchDatei.bat"

    Das wars auch schon. Wenn du für den Benutzeraccount ein Passwort vergeben hast musste dies nun auch eintippen.

    Ob die Batch nun läuft, kannste im Taskmanager prüfen, auf der Seite "Prozesse". Dazu unten den Haken bei "Prozesse aller Nutzer zeigen" aktivieren und dann sollte er in der Liste auftauchen.


    Die Batchdatei läuft nun. Den Befehl kann man so ebenfalls per at Kommando im Taskplaner eintragen.


    Gruß


    computerbase.de/forum/showthread.php?t=256571&page=2

    Und warum zum Geier brauchst du eine Batchdatei? Process.Start() macht im Endeffekt nichts anderes als die Batchdatei ... und man kann auch Parameter übergeben ... ?(

    Grüße
    Phil
    Hoffe ich bin jetzt nicht der Spielverderber, aber ich wollt das grad mal selbst testen und wenn ichs eh grad offen hab...

    VB.NET-Quellcode

    1. Public Shared Sub RunHiddenExecutable(ByVal strFileName As String, ByVal strArguments As String, ByVal blnWaitForExit As Boolean, ByVal strLogPath As String)
    2. Dim blnOutputLogFile As Boolean = True
    3. If strLogPath Is Nothing OrElse strLogPath.Length = 0 Then
    4. blnOutputLogFile = False
    5. End If
    6. Dim sb As New System.Text.StringBuilder()
    7. Try
    8. Dim psi As New ProcessStartInfo()
    9. psi.WindowStyle = ProcessWindowStyle.Hidden
    10. psi.CreateNoWindow = True
    11. psi.FileName = strFileName
    12. psi.Arguments = strArguments
    13. psi.UseShellExecute = False
    14. psi.RedirectStandardOutput = True
    15. Dim p As Process = System.Diagnostics.Process.Start(psi)
    16. sb.Append(p.StandardOutput.ReadToEnd())
    17. If blnWaitForExit Then
    18. p.WaitForExit()
    19. End If
    20. Catch ex As Exception
    21. sb.Append("Exception Occured:" & Constants.vbCrLf)
    22. sb.Append(ex.ToString())
    23. Throw
    24. End Try
    25. End Sub


    f0x
    Am besten versuchst du dich selbst mal drin, hier helfen wir dir nicht bei solchen Fragen... du kriegst sogar einen kompletten Code und verlangst dann auch noch nach einer Erklärung...

    Lies ein gutes Buch und meld dich dann wieder. Wer das nicht kann, sollte sich echt mal Gedanken machen... Ist ja nichts schlimmes aber dann kann derjenige sich auch mal selbst "fortbilden" und suchen und nicht andere mit sowas nerven.