Ich versuche, dieses einfache Testskript auszuführen, aber nachdem ich das Skript ausgeführt habe, erscheint ein Befehlsshellfenster.:
%Vor%Wie kann ich verhindern, dass es angezeigt wird?
Aktualisieren
Ich konnte es mit dieser Codeänderung verbessern:
%Vor%Jetzt erscheint das Fenster nur für einen Bruchteil einer Sekunde. Aber ich möchte nicht, dass es überhaupt auftaucht.
Sie werden immer einen Fensterblitz mit Exec()
bekommen. Sie können stattdessen Run()
verwenden, um den Befehl in einem versteckten Fenster auszuführen. Aber Sie können die Ausgabe des Befehls nicht direkt mit Run()
erfassen. Sie müssten die Ausgabe in eine temporäre Datei umleiten, die Ihr VBScript öffnen, lesen und löschen könnte.
Zum Beispiel:
%Vor% Die Klasse FileSystemObject
hat Methoden wie GetSpecialFolder()
um den Pfad des temporären Windows-Ordners und GetTempName()
abzurufen um einen temporären Dateinamen zu generieren, den Sie verwenden können, anstatt einen Ausgabedateinamen wie oben beschrieben zu kodieren.
Beachten Sie auch, dass Sie das Argument /FO CSV
mit tasklist.exe
verwenden können, um eine CSV-Datei zu erstellen, die das Parsen erheblich vereinfachen sollte.
Schließlich sind VBScript "native" Möglichkeiten, die Liste der laufenden Prozesse abzurufen. Die Klasse Win32_Process
von WMI kann dies beispielsweise ohne die Notwendigkeit für Run/Exec
.
Bearbeiten :
Der Vollständigkeit halber sollte ich erwähnen, dass sich Ihr Skript in einem versteckten Konsolenfenster neu starten kann, in dem Sie Exec()
im Hintergrund ausführen können. Leider versteckt dieses verborgene Konsolenfenster auch Ihre Ausgabe von Funktionen wie WScript.Echo()
. Abgesehen davon werden Sie wahrscheinlich keine Unterschiede feststellen, wenn Sie Ihr Skript unter cscript
vs wscript
ausführen. Hier ist ein Beispiel für diese Methode:
Natürlich, wenn Ihr Skript Kommandozeilenparameter erwartet, müssten diese beim erneuten Start Ihres Skripts weitergeleitet werden.
Bearbeiten 2 :
Eine weitere Möglichkeit ist die Verwendung der Windows-Zwischenablage. Sie können die Ausgabe Ihres Befehls an das Dienstprogramm clip.exe
übergeben. Rufen Sie dann den Text über eine beliebige Anzahl von verfügbaren COM-Objekten ab, die auf den Inhalt der Zwischenablage zugreifen können. Zum Beispiel:
Sie können die .Exec()
-Methode verwenden, ohne das Flash-Fenster des Konsolenfensters, temporäre Dateien und das unerwartete WScript.Echo
output-Muting. Die Methode ist etwas knifflig und erfordert das Starten eines sekundären verknüpften Skripts. Daher habe ich die Kommentare hinzugefügt:
AKTUALISIEREN
Ich habe den Code etwas überarbeitet, um es einfacher zu machen:
%Vor%BTW, hier ist VBScript "Multithreading" -Implementierung , die den gleichen Container-Ansatz verwendet.
Einige gute Vorschläge sind oben aufgeführt. Ich möchte einen weiteren Vorschlag machen, der eher eine Umgehungslösung ist. Sie können Sysinternals Desktops (ein kostenloses Programm) verwenden, um Ihr Makro auf einem anderen Desktop auszuführen Maschine. So kann das Flashen alles auf seinem eigenen Desktop passieren und Ihre Arbeit nicht unterbrechen.
Ich benutze Sysinternals PSEXEC Ссылка
Erstellt eine Batch-Datei (im selben Ordner wie die vbs und exe-Datei), die das Skript als Systembenutzer ausführt. Ich kann nicht auf das Benutzerprofil zugreifen und ich muss lokaler Administrator sein, aber wenn ich das Skript ohne Interaktion mit dem Desktop ausführe, werden alle lästigen Popups ausgeblendet.
Führen Sie Script als System ohne Interaktion mit dem Desktop aus
"%~dp0PsExec.exe" -s wscript.exe "%~dp0MyScript.vbs"
Führen Sie Script als System mit Interaktion mit dem Desktop aus
"%~dp0PsExec.exe" -s -i wscript.exe "%~dp0MyScript.vbs"