Windows XP oder höher Windows: Wie kann ich eine Batchdatei im Hintergrund ausführen, ohne dass ein Fenster angezeigt wird?

121

Ich weiß, dass ich bereits eine ähnliche Frage beantwortet habe ( Batch-Datei im Hintergrund ausführen, wenn Windows gestartet wird), aber dieses Mal muss ich einen Batch starten:

  • aus einer anderen Charge,
  • ohne dass ein Konsolenfenster angezeigt wird,
  • Alle Argumente werden an den unsichtbaren Stapel übergeben.

Der erste Stapel wird in einem Konsolenfenster ausgeführt. Ich möchte jedoch nicht, dass der zweite Stapel (der vom ersten asynchron gestartet wird ) auch ein Konsolenfenster anzeigt.

Ich habe ein VBScript-Skript entwickelt, das genau das tut, und ich habe das Skript als Antwort für andere angegeben, auf die sie sich beziehen können. Wenn Sie jedoch andere Ideen / Lösungen haben, können Sie gerne einen Beitrag leisten.

Hinweis: Das Konsolenfenster des Windows-Befehlsprozessors wird von vielen Personen als nicht wirklich korrektes DOS-Fenster bezeichnet.


Vielen Dank für die Antworten. Soweit ich weiß, muss ich ein Skript asynchron aufrufen, um es in einem unsichtbaren Modus auszuführen:

  • Von einem zweiten Skript bereits in einem Konsolenfenster start /breicht das aus.
  • Unter Windows ist meine Lösung weiterhin gültig , ohne ein zweites Fenster auszulösen .
VonC
quelle
Sie starten die Batch-Datei aus einer anderen Batch-Datei? Hat diese bereits laufende Batchdatei ein Fenster?
Oddthinking
Ja, dieser andere (erste) Stapel wird in einem DOS-Fenster ausgeführt. Ich möchte jedoch nicht, dass der zweite Stapel (asynchroner Start durch den ersten) auch ein Fenster anzeigt (was mit einem 'start / b'-Befehl geschehen würde)
VonC

Antworten:

53

Benötigen Sie die zweite Batchdatei, um asynchron ausgeführt zu werden? Normalerweise führt eine Batchdatei eine andere synchron mit dem callBefehl aus, und die zweite teilt das Fenster des ersten.

Sie können verwenden start /b second.bat eine zweite Batch - Datei zu starten , einen synchron von Ihrem ersten , dass die Aktien Ihrer ersten eigenen Fenster. Wenn beide Batchdateien gleichzeitig in die Konsole schreiben, überlappt sich die Ausgabe und ist wahrscheinlich nicht zu entziffern. Außerdem möchten Sie einen exitBefehl am Ende Ihrer zweiten Batch-Datei einfügen oder sich innerhalb einer zweiten cmdShell befinden, sobald alles erledigt ist.

P Papa
quelle
1
Richtig. Ich habe geglaubt, start / b würde ein neues Fenster öffnen, aber wenn es unter einem DOS-Fenster ausgeführt wird, hat es dieselben Fenster.
VonC
110

Hier ist eine mögliche Lösung:

Rufen Sie in Ihrem ersten Skript Ihr zweites Skript mit der folgenden Zeile auf:

wscript.exe invis.vbs run.bat %*

Eigentlich rufen Sie ein vbs-Skript auf mit:

  • der [Pfad] \ Name Ihres Skripts
  • alle anderen Argumente, die Ihr Skript benötigt ( %*)

Anschließend ruft invis.vbs Ihr Skript mit der Windows Script Host Run () -Methode auf , die Folgendes umfasst :

  • intWindowStyle: 0 bedeutet "unsichtbare Fenster"
  • bWaitOnReturn: false bedeutet, dass Ihr erstes Skript nicht auf den Abschluss Ihres zweiten Skripts warten muss

Hier ist invis.vbs:

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
        anArg = args.Item(k)
        sargs = sargs & anArg & " "
    next
end if

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False
VonC
quelle
3
2k Aufrufe und was für ein toller Beitrag + Antwort, mehr Leute sollten diesen Thread abstimmen
Ric Tokyo
Tolle Lösung, genau das, was ich brauchte.
Nikil
Das einzige Problem ist, dass dadurch ein Prozess namens "cmd.exe" erstellt wird, der in Zukunft schwer zu finden ist.
Aditya Gupta
12

Konvertieren Sie die Batch-Datei in eine Exe. Probieren Sie Bat To Exe Converter oder Online Bat To Exe Converter aus und wählen Sie die Option, um es als Geisteranwendung auszuführen, dh ohne Fenster.

Rob Kam
quelle
3
Möglich, aber ich werde versuchen, in diesem Fall jeden zusätzlichen Schritt zu vermeiden.
VonC
21
Ich bin normalerweise nicht so paranoid, aber wäre es nicht sehr dumm, jemanden anonym diese Exe für mich generieren zu lassen? Alle Arten von bösartigem Zeug könnten injiziert werden.
Tobias
9

Ich denke, dies ist die einfachste und kürzeste Lösung, um eine Batch-Datei auszuführen, ohne das DOS-Fenster zu öffnen. Es kann sehr ablenkend sein, wenn Sie eine Reihe von Befehlen planen möchten, die regelmäßig ausgeführt werden sollen. Daher wird das DOS-Fenster immer wieder angezeigt. Hier ist Ihre Lösung . Verwenden Sie ein VBS-Skript, um die Batch-Datei aufzurufen ...

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 
Set WshShell = Nothing 

Kopieren Sie die obigen Zeilen in einen Editor und speichern Sie die Datei mit der Erweiterung .VBS. Bearbeiten Sie den Namen und den Pfad der .BAT-Datei entsprechend.

Indago
quelle
1
Interessanter Ansatz, sicherlich kürzer als meine Lösung. +1
VonC
Tolle Lösung. Beim Lesen habe ich festgestellt, dass es nicht wirklich nötig ist, es Set WshShell = Nothinghat gut funktioniert und Sie können einen noch kleineren Weg haben, dies zu tun.
Patrick Bard
7

Hier ist meine Sammlung von Möglichkeiten, um dies zu erreichen - und noch mehr -, wo es möglich war, dass ich versucht habe, auch die PID des gestarteten Prozesses zurückzugeben (alle verknüpften Skripte können heruntergeladen und unter einem beliebigen Namen gespeichert werden, den Sie für zweckmäßig halten):

1) Der IEXPRESS Lösung kann auch auf alten Win 95/98-Maschinen verwendet werden. Iexpress ist ein wirklich altes Tool, das immer noch mit Windows gepackt ist - da Argumente nur den Befehl und seine Argumente akzeptieren.

Anwendungsbeispiel:

call IEXPhidden.bat "cmd /c myBat.bat"  "argument"

2) SCHTASKS - wieder nur zwei Argumente - den Befehl und die Argumente. Überprüft auch, ob es mit erhöhten Berechtigungen gestartet wurde und erhält nach Möglichkeit die PID des Prozesses mit WEVTUTIL (verfügbar ab Vista und höher, damit die neuere Version von Windows die erhält PID) Befehl.

Anwendungsbeispiel:

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"

3) 'WScript.Shell' - Das Skript ist ein vollständiger Wrapper von 'WScript.Shell' und jede mögliche Option kann über die Befehlszeilenoptionen festgelegt werden. Es ist ein jscript / Batch-Hybrid und kann als Fledermaus aufgerufen werden.

Anwendungsbeispiel (für weitere Informationen drucken Sie die Hilfe mit '-h'):

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 

4) 'Win32_ProcessStartup' - wieder vollständiger Wrapper und alle Optionen sind über die Befehlszeilenargumente zugänglich. Diesmal ist es WSF / Batch-Hybrid mit einigen Jscript- und einigen VBScript-Codeteilen - aber es gibt die PID des gestarteten Prozesses zurück nicht ausgeblendet Einige Optionen wie X / Y-Koordinaten können verwendet werden (gilt nicht für jede ausführbare Datei - aber zum Beispiel akzeptiert cmd.exe Koordinaten).

Anwendungsbeispiel (für weitere Informationen drucken Sie die Hilfe mit '-h'):

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"

5) Die.NET-Lösung . Die meisten Optionen der ProcessStartInfo-Optionen werden verwendet (aber am Ende war ich zu müde, um alles einzuschließen):

Anwendungsbeispiel (für weitere Informationen drucken Sie die Hilfe mit '-h'):

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal
npocmaka
quelle
2

In der anderen Frage schlug ich autoexnt vor . Das ist auch in dieser Situation möglich. Stellen Sie den Dienst einfach so ein, dass er manuell ausgeführt wird (dh beim Start nicht automatisch). Wenn Sie Ihren Stapel ausführen möchten, ändern Sie die Datei autoexnt.bat, um die gewünschte Stapeldatei aufzurufen, und starten Sie den Dienst autoexnt.

Die Batchdatei zum Starten kann folgendermaßen aussehen (ungetestet):

echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat
net start autoexnt

Beachten Sie, dass auf diese Weise gestartete Batchdateien als Systembenutzer ausgeführt werden. Dies bedeutet, dass Sie nicht automatisch auf Netzwerkfreigaben zugreifen können. Sie können jedoch die Nettonutzung verwenden , um eine Verbindung zu einem Remote-Server herzustellen.

Sie müssen das Windows 2003 Resource Kit herunterladen , um es zu erhalten. Das Resource Kit kann auch auf anderen Windows-Versionen wie Windows XP installiert werden.

wimh
quelle
1
Interessant, aber ein enger Overkill für dieses Szenario.
VonC
2

Führen Sie es unter einem anderen Benutzernamen aus, verwenden Sie "runas" oder planen Sie es unter einem anderen Benutzer in Windows Scheduled Tasks.

JosephStyons
quelle
Möglich, aber nicht genau das, wonach ich
suche
0

Sie können Ihre .bat-Datei über eine .vbs-Datei
ausführen. Kopieren Sie den folgenden Code in Ihre .vbs-Datei:

Dim WshShell
Dim obj
Set WshShell = WScript.CreateObject("WScript.Shell") 
obj = WshShell.Run("C:\Users\file1.bat", 0) 
obj = WshShell.Run("C:\Users\file2.bat", 0)  and so on
set WshShell = Nothing 
Vinod Chelladurai
quelle
0

Sie können auch verwenden

start /MIN notepad.exe

PS: Leider hängt der minimierte Fensterstatus vom auszuführenden Befehl ab. VG funktioniert nicht

start /MIN calc.exe
user2928048
quelle