2012-10-01 25 views
7

Desidero ottenere il risultato di un semplice comando dalla riga di comando (cmd.exe) utilizzando uno script di Windows (.vbs). Come è fatto? Non sono stato in grado di trovare un buon esempio o spiegazione. È possibile utilizzare il comando "data" o "ora" per fornire un esempio con. Come ad esempio:vbs come ottenere risultato da un comando da riga di comando

enter image description here

P.S. Sono in grado di scrivere il codice dello script che apre cmd.exe e invia il comando.

Grazie!

+0

più 1 perché il diagramma è fantastico: o –

risposta

10

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.

+0

Okay, funziona, grazie, ma suppongo che non mi aspettassi una risposta così snella. Spiegherò solo quello che sto cercando di fare. Voglio usare la programmazione basata sulla riga di comando di Atmel per programmare alcuni chip. È davvero facile da usare e funziona bene. Sono in grado di richiamare la shell dei comandi e inviarli i comandi usando SendKeys, ma quando provo ad includere il comando usando Exec, si apre la finestra ma non si inserisce il comando. Cosa sta facendo realmente "/ c"? C'è un altro modo per ottenere l'output di un comando? Ho bisogno di un modo per sapere se la programmazione ha avuto successo o meno. – user1387865

+0

Grazie per l'aiuto! Lo apprezzo. Non ho ancora avuto successo. Per qualche motivo, quando invio Set p = CreateObject("WScript.Shell").Exec("%COMSPEC% /c atprogram"), si apre semplicemente il terminale senza immettere il comando "atprogram".Ho provato diverse cose ma semplicemente non eseguirò il comando. Mi sento obbligato a usare SendKeys ma non riesco a vedere l'output a meno che non esca dalla finestra del terminale aperta. – user1387865

Problemi correlati