2012-11-02 3 views
9

Attualmente utilizziamo i file di comando di Windows Batch (DOS) per controllare il flusso del processo. Per visualizzare i messaggi sulla console, utilizzeremmo il comando ECHO. Questi messaggi verrebbero visualizzati nel nostro software Scheduler, che era Tivoli e ora è CA WA Workstation \ ESP.Qual è l'equivalente di un comando ECHO di gruppo utilizzando VBScript?

Vorrei iniziare a utilizzare i file VBS invece dei file CMD \ BAT e sto cercando di capire come eseguire l'equivalente di un ECHO sulla console.

Quando si tenta di utilizzare il comando WScript.Echo o scrivere su Standard Out, i messaggi vengono visualizzati nelle finestre di dialogo per entrambi e richiedono che venga premuto il pulsante OK per continuare. Non sorprendentemente, quando eseguo un programmatore automatico, il lavoro preme uno di questi comandi e si blocca solo perché non c'è nessuno che prenda il messaggio.

SET FS = CreateObject("Scripting.FileSystemObject") 
SET StdOut = FS.GetStandardStream(1) 
StdOut.Write("Test 1") 

WScript.echo("Test 2") 

mi rendo conto che potrei scrivere i messaggi in un file di registro utilizzando l'oggetto di script, ma questo potrebbe non riuscire se un percorso non valido viene fornito oa causa di autorizzazioni insufficienti. Inoltre, essere in grado di vedere il feedback scritto nello Scheduler è terribilmente conveniente.

Come scrivere sulla console utilizzando VBScript? Ho visto altri post qui che suggeriscono che i metodi di cui sopra che non hanno funzionato per la ragione sopra descritta erano il modo per farlo.

+0

consiglio vivamente di passare a PowerShell invece di VBScript. –

risposta

10

wscript.echo è il comando corretto, ma per eseguire l'output su console anziché su dialog è necessario eseguire lo script con cscript anziché wscript.

È possibile risolvere questo da

  • esecuzione dello script da linea di comando in questo modo:

    cscript myscript.vbs 
    
  • cambiare l'associazione di file predefinito (o la creazione di una nuova estensione di file e di associazione per quegli script vuoi correre con cscript).

  • cambiare il motore tramite l'opzione host di script (ossia a http://support.microsoft.com/kb/245254)

    cscript //h:cscript //s 
    
  • Oppure è possibile aggiungere poche righe per l'inizio della vostra script per costringerlo a cambiare "motore" da wscript per cscript - vedi http://www.robvanderwoude.com/vbstech_engine_force.php (copiato sotto):

    RunMeAsCScript 
    
    'do whatever you want; anything after the above line you can gaurentee you'll be in cscript 
    
    Sub RunMeAsCScript() 
         Dim strArgs, strCmd, strEngine, i, objDebug, wshShell 
         Set wshShell = CreateObject("WScript.Shell") 
         strEngine = UCase(Right(WScript.FullName, 12)) 
         If strEngine <> "\CSCRIPT.EXE" Then 
           ' Recreate the list of command line arguments 
           strArgs = "" 
           If WScript.Arguments.Count > 0 Then 
             For i = 0 To WScript.Arguments.Count 
               strArgs = strArgs & " " & QuoteIt(WScript.Arguments(i)) 
             Next 
           End If 
           ' Create the complete command line to rerun this script in CSCRIPT 
           strCmd = "CSCRIPT.EXE //NoLogo """ & WScript.ScriptFullName & """" & strArgs 
           ' Rerun the script in CSCRIPT 
           Set objDebug = wshShell.Exec(strCmd) 
           ' Wait until the script exits 
           Do While objDebug.Status = 0 
             WScript.Sleep 100 
           Loop 
           ' Exit with CSCRIPT's return code 
           WScript.Quit objDebug.ExitCode 
         End If 
    End Sub 
    
    'per Tomasz Gandor's comment, this will ensure parameters in quotes are covered: 
    function QuoteIt(strTemp) 
         if instr(strTemp," ") then 
           strTemp = """" & replace(strTemp,"""","""""") & """" 
         end if 
         QuoteIt = strTemp 
    end function 
    
+2

Mi sono imbattuto qui con lo stesso problema, usando JS. Il controllo per wscript/cscript è molto più elegante lì: 'if (! WScript.FullName.match (" cscript.exe ")) {...}'. (o magari aggiungere un '$' all'espressione regolare, per ogni evenienza). Non sto rieseguendo la sceneggiatura, cambiando solo la verbosità a seconda del motore utilizzato. BTW, nell'esempio sopra: per quanto riguarda l'argomento escape/quoting? Funzionerà con argomenti contenenti spazi? Aha! –

+0

Un buon punto: avevo appena copiato e incollato il codice dal sito di riferimento - ora ho risolto una soluzione rapida per tale scenario (ad esempio aggiungendo la funzione QuoteIt). Bel consiglio anche sul fronte JS. Grazie a @TomaszGandor. – JohnLBevan

+1

@JohnLBevan -0.499 per la progettazione della funzione QuoteIt (utilizzando WScript.Arguments globale (i) invece del parametro passato strTemp). –

Problemi correlati