Hai sempre intenzione di ottenere una finestra con Exec()
. È possibile utilizzare Run()
per eseguire il comando in una finestra nascosta. Ma non è possibile acquisire direttamente l'output del comando con Run()
. Dovresti reindirizzare l'output su un file temporaneo che il tuo VBScript potrebbe quindi aprire, leggere ed eliminare.
Ad esempio:
With CreateObject("WScript.Shell")
' Pass 0 as the second parameter to hide the window...
.Run "cmd /c tasklist.exe > c:\out.txt", 0, True
End With
' Read the output and remove the file when done...
Dim strOutput
With CreateObject("Scripting.FileSystemObject")
strOutput = .OpenTextFile("c:\out.txt").ReadAll()
.DeleteFile "c:\out.txt"
End With
La classe FileSystemObject
ha metodi come GetSpecialFolder()
per recuperare il percorso della cartella temporanea di Windows e GetTempName()
per generare un nome di file temporaneo che è possibile utilizzare invece di hardcoding un nome di file di output come ho ho fatto sopra.
Si noti inoltre che è possibile utilizzare l'argomento /FO CSV
con tasklist.exe
per creare un file CSV che dovrebbe semplificare l'analisi.
Infine, ci sono VBScript "nativo" modi per recuperare l'elenco dei processi in esecuzione. La classe Win32_Process
di WMI, ad esempio, può eseguire questa operazione senza la necessità di Run/Exec
.
Edit:
Per ragioni di completezza, vorrei ricordare che lo script può stesso rilancio in una finestra di console nascosta in cui è possibile eseguire Exec()
silenzio. Sfortunatamente, questa finestra della console nascosta nasconderà il tuo output da funzioni come WScript.Echo()
. A parte questo, tuttavia, probabilmente non noterai alcuna differenza nell'esecuzione del tuo script sotto cscript
rispetto a wscript
. Ecco un esempio di questo metodo:
' If running under wscript.exe, relaunch under cscript.exe in a hidden window...
If InStr(1, WScript.FullName, "wscript.exe", vbTextCompare) > 0 Then
With CreateObject("WScript.Shell")
WScript.Quit .Run("cscript.exe """ & WScript.ScriptFullName & """", 0, True)
End With
End If
' "Real" start of script. We can run Exec() hidden now...
Dim strOutput
strOutput = CreateObject("WScript.Shell").Exec("tasklist.exe").StdOut.ReadAll()
' Need to use MsgBox() since WScript.Echo() is sent to hidden console window...
MsgBox strOutput
Naturalmente, se il vostro script si aspetta che i parametri della riga di comando, chi avrebbe bisogno di essere inoltrato quando rilanciare lo script come bene.
Edit 2:
Ancora un'altra possibilità è quella di utilizzare la clipboard di Windows. È possibile reindirizzare l'output del comando all'utilità clip.exe
. Quindi, recuperare il testo tramite qualsiasi numero di oggetti COM disponibili che possono accedere ai contenuti degli Appunti.Per esempio:
' Using a hidden window, pipe the output of the command to the CLIP.EXE utility...
CreateObject("WScript.Shell").Run "cmd /c tasklist.exe | clip", 0, True
' Now read the clipboard text...
Dim strOutput
strOutput = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")
Suggerimento: per me ha funzionato solo con 'cmd.exe/C ... 'invece di' cmd/C ... ' – Black
La connessione al comando CLIP funziona meravigliosamente, grazie. –