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.