In caso di dubbio, leggere documentation. Probabilmente si desidera qualcosa di simile:
Set p = CreateObject("WScript.Shell").Exec("%COMSPEC% /c date /t")
Do While p.Status = 0
WScript.Sleep 100
Loop
WScript.Echo p.StdOut.ReadAll
Edit: Quando si utilizza Exec()
si passa ingresso tramite il descrittore .StdIn
, non tramite SendKeys()
(che è un modo piuttosto inaffidabile di passare in ingresso in ogni caso).
%COMSPEC%
è una variabile di ambiente di sistema con il percorso completo cmd.exe
e l'opzione /c
rende cmd.exe
uscita dopo il comando (date /t
nell'esempio) è terminata.
Se il comando indica successo/errore con un codice di uscita, è possibile verificare la proprietà ExitCode
al termine del comando.
If p.Status <> 0 Then WScript.Echo p.ExitCode
Edit2: Invece di usare atprogram
in modo interattivo, si può costruire comandi da che si esibiranno compiti particolari senza l'interazione dell'utente? Con comandi da non interattive qualcosa di simile potrebbe funzionare:
prompt = "C:\>"
atprogram_cmdline_1 = "atprogram.exe ..."
atprogram_cmdline_2 = "atprogram.exe ..."
'...
Function ReadOutput(p)
text = ""
Do Until Right(text, Len(prompt)) = prompt
text = text & p.StdOut.Read(1)
Loop
ReadOutput = text
End Function
Set cmd = CreateObject("WScript.Shell").Exec("%COMSPEC% /k")
ReadOutput cmd ' skip over first prompt
cmd.StdIn.WriteLine(atprogram_cmdline_1)
WScript.Echo ReadOutput(cmd)
cmd.StdIn.WriteLine(atprogram_cmdline_2)
WScript.Echo ReadOutput(cmd)
'...
cmd.Terminate ' exit CMD.EXE
%COMSPEC% /k
genera un prompt dei comandi, senza l'esecuzione di un comando. /k
impedisce la chiusura. Poiché non si chiude automaticamente, non è possibile utilizzare il ciclo While p.Status = 0
qui. Se un comando richiede un po 'di tempo per terminare, è necessario un numero di secondi pari a WScript.Sleep
.
Via cmd.StdIn.WriteLine
è possibile eseguire le righe di comando nell'istanza CMD
. La funzione ReadOutput()
legge l'output da StdOut
finché non viene visualizzato il prompt successivo. Devi cercare il prompt, perché le operazioni di lettura stanno bloccando, quindi non puoi semplicemente dire "leggi tutto ciò che è stato stampato ancora".
Dopo aver terminato, chiudere CMD.EXE
tramite cmd.Terminate
.
più 1 perché il diagramma è fantastico: o –