Eingabeaufforderungsfenster ausblenden bei Verwendung von Exec ()

7

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.

    
Black 30.08.2015, 14:39
quelle

4 Antworten

19

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:

%Vor%

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:

%Vor%     
Bond 30.08.2015, 15:54
quelle
5

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:

%Vor%

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.

    
omegastripes 30.08.2015 23:35
quelle
2

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.

    
Fidel 13.10.2016 10:21
quelle
1

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"

    
Henrik Andersen 23.11.2017 06:18
quelle

Tags und Links