Posso passare un argomento a un VBScript (file vbs avviato con cscript)?


85

Ho questo script salvato in "test.vbs":

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile(workFolder &"\test.txt", 2, True)
File.Write "testing"
File.Close
Set File = Nothing
Set FSO = Nothing
Set workFolder = Nothing

Quando eseguo lo script, voglio passare il valore della variabile "workFolder".

Come posso fare questo? Posso farlo? Qualcosa come "cscript test.vbs workFolder: 'C: \ temp \'" forse?

Domanda bonus: è necessario pulire la variabile passata con "Set workFolder = Nothing" o VBSCript lo fa automaticamente quando termina? Forse anche "Set File = Nothing" e "Set FSO = Nothing" sono inutili? Per favore fatemi sapere se conoscete la risposta a entrambe queste domande.

Risposte:


138

Puoi usare WScript.Argumentsper accedere agli argomenti passati al tuo script.

Chiamando lo script:

cscript.exe test.vbs "C:\temp\"

Dentro il tuo script:

Set File = FSO.OpenTextFile(WScript.Arguments(0) &"\test.txt", 2, True)

Non dimenticare di controllare se è stato effettivamente passato un argomento al tuo script. Puoi farlo controllando la Countproprietà:

if WScript.Arguments.Count = 0 then
    WScript.Echo "Missing parameters"
end if

Se lo script è terminato dopo aver chiuso il file, non è necessario impostare le variabili su Nothing. Le risorse verranno eliminate automaticamente al termine del processo cscript.exe. L'impostazione di una variabile su Nothingnormalmente è necessaria solo se si desidera esplicitamente liberare risorse durante l'esecuzione del proprio script. In tal caso, imposterete le variabili che contengono un riferimento a un oggetto COM su Nothing, che rilascerà l'oggetto COM prima che lo script termini. Questa è solo una breve risposta alla tua domanda bonus, troverai maggiori informazioni in queste domande correlate:

È necessario impostare gli oggetti su Niente all'interno delle funzioni VBA

Quando devo impostare una variabile su "Nothing" in VB6?


Bingo, questo è tutto! Molto chiaro, grazie mille. (La domanda bonus è ancora aperta nel caso qualcuno volesse rispondere in uno di questi commenti.)
— Peter

@Peter: ho aggiunto una breve risposta alla tua domanda bonus.
— Dirk Vollmar

21

All'interno di VBS è possibile accedere ai parametri con

Wscript.Arguments(0)
Wscript.Arguments(1)

e così via. Il numero di parametri:

Wscript.Arguments.Count

Grazie! (La domanda bonus è ancora aperta nel caso qualcuno volesse rispondere in uno di questi commenti.)
— Peter

6

È possibile accedere a ogni argomento passato tramite la riga di comando con: Wscript.Arguments.Item (0) dove lo zero è il numero dell'argomento: cioè 0, 1, 2, 3 ecc.

Quindi nel tuo codice potresti avere:

strFolder = Wscript.Arguments.Item(0) 

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile(strFolder, 2, True)
File.Write "testing"
File.Close
Set File = Nothing
Set FSO = Nothing
Set workFolder = Nothing

Utilizzando wscript.arguments.count, puoi intercettare errori nel caso in cui qualcuno non inserisca il valore corretto, ecc.

Esempi di MS Technet


Aha, grazie amico. È interessante che non sia necessario creare un'istanza di Wcript. (La domanda bonus è ancora aperta nel caso qualcuno volesse rispondere in uno di questi commenti.)
— Peter

1) workFoldernon è definito come un oggetto né nella risposta precedente né nella domanda originale, quindi Set workFolder = Nothingdovrebbe sollevare un errore. 2) Poiché l'argomento non è suggerito in quanto necessita di essere riutilizzato più di una volta, forse saltare l'assegnazione alla strFoldervariabile. 3) Suggerirei di utilizzare al xposto di 0inWscript.Arguments.Item(0)
— user66001

In realtà non solleverebbe un errore a meno che non sia stata impostata l'opzione esplicita, e in quel caso non funzionerebbe nulla poiché non è stato definito nulla. Questo è vero per la variabile tuttavia, non è necessaria, quindi di nuovo nemmeno gli oggetti FSO o FILE e un semplice con potrebbe essere utilizzato. Un sacco di approcci diversi possibili ... :)
— unrealtrip

2

Puoi anche usare argomenti con nome che sono opzionali e possono essere forniti in qualsiasi ordine.

Set namedArguments = WScript.Arguments.Named

Ecco una piccola funzione di aiuto:

Function GetNamedArgument(ByVal argumentName, ByVal defaultValue)
  If WScript.Arguments.Named.Exists(argumentName) Then
    GetNamedArgument = WScript.Arguments.Named.Item(argumentName) 
  Else  
    GetNamedArgument = defaultValue
  End If
End Function

Esempio VBS:

'[test.vbs]
testArg = GetNamedArgument("testArg", "-unknown-")
wscript.Echo now &": "& testArg

Utilizzo di esempio:

test.vbs /testArg:123

0

Per rispondere alla tua domanda bonus, la risposta generale è no, non è necessario impostare le variabili su "Nothing" in breve script .VBS come il tuo, che vengono chiamati da Wscript o Cscript.

Il motivo per cui potresti farlo nel mezzo di uno script più lungo è di rilasciare la memoria al sistema operativo che VB avrebbe altrimenti tenuto. Oggigiorno, quando 8 GB di RAM sono tipici e 16 GB + relativamente comuni, è improbabile che questo produca un impatto misurabile, anche su uno script enorme che ha diversi megabyte in una singola variabile. A questo punto è una specie di residuo dei giorni in cui avresti potuto lavorare con 1 MB o 2 MB di RAM.

Hai ragione, nel momento in cui il tuo script .VBS viene completato, tutte le tue variabili vengono distrutte e la memoria viene comunque recuperata. L'impostazione delle variabili su "Nothing" accelera semplicemente il processo e ti consente di farlo durante uno script.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.