2010-05-10 10 views
67

Ho questo script salvato in "Test.vbs":Posso passare un argomento a un VBScript (file vbs lanciato con cscript)?

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 la sceneggiatura ho voglia di passare il valore della variabile "workFolder".

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

Domanda bonus: E 'necessario da ripulire la variabile passata con "Set workFolder = Nothing" o se VBScript farlo automaticamente quando termina? Forse "Set File = Nothing" e "Set FSO = Nothing" non è necessario? Per favore fatemi sapere se conoscete la risposta a entrambe queste domande.

risposta

112

È possibile utilizzare WScript.Arguments per accedere agli argomenti passati al proprio script.

Chiamando lo script:

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

All'interno del vostro script:

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

Non dimenticare di controllare se ci realmente è stato un argomento passato allo script. È possibile farlo controllando la proprietà Count:

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

Se lo script è finita dopo aver chiuso il file, allora non c'è bisogno di impostare le variabili da Nothing. Le risorse verranno ripulite automaticamente quando il processo cscript.exe termina. L'impostazione di una variabile su Nothing di solito è necessaria solo se desideri esplicitamente liberare risorse durante l'esecuzione del tuo script. In tal caso, impostare le variabili che contengono un riferimento a un oggetto COM su Nothing, che rilascia l'oggetto COM prima che lo script termini. Questa è solo una breve risposta alla tua domanda bonus, troverete ulteriori informazioni in queste questioni relative:

Is there a need to set Objects to Nothing inside VBA Functions

When must I set a variable to “Nothing” in VB6?

+0

Bingo, il gioco è fatto! Molto chiaro, grazie mille. (La domanda bonus è ancora aperta nel caso qualcuno volesse rispondere ad uno di questi commenti.) – Peter

+0

@Peter: ho aggiunto una breve risposta alla tua domanda bonus. –

5

Ogni argomento passato tramite linea di comando è possibile accedere con: Wscript.Arguments.Item (0) Dove lo zero è il numero dell'argomento: cioè 0, 1, 2, 3 ecc.

Quindi nel codice si può 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, è possibile errore trappola nel caso in cui qualcuno non immettere il valore corretto, ecc

MS Technet examples

+0

Aha, grazie amico. Interessante che non devi creare un'istanza di Wcript. (La domanda bonus è ancora aperta nel caso in cui qualcuno vuole rispondere in uno di questi commenti.) – Peter

+0

1) 'workFolder' non è definito come un oggetto sia nella risposta di cui sopra, o alla domanda iniziale, in modo da' Set workFolder = Nothing 'dovrebbe generare un errore. 2) Dato che l'Argomento non è suggerito come bisogno di essere riutilizzato più di una volta, forse ignorarlo assegnandolo alla variabile 'strFolder'. 3) suggerirei di usare 'x' invece di' 0' in 'Wscript.Arguments.Item (0)' – user66001

+0

In realtà sarebbe non generare un errore meno che l'opzione è stata impostata esplicitamente, e in quel caso nulla avrebbe funzionato perché nulla è stato definito . Questo è vero per la variabile, tuttavia, non è necessario, quindi nemmeno gli oggetti FSO o FILE e potrebbe essere usato un semplice con. Un sacco di approcci diversi possibili ... :) – unrealtrip

16

All'interno di VBS è possibile accedere ai parametri con

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

e così via. Il numero del parametro:

Wscript.Arguments.Count 
+0

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

2

In realtà la risposta alla domanda bonus è "No". Non è necessario pulire. Ma la pratica di programmazione generale è di ripulire sempre le tue cose, come dopo cena, per pulire il piatto.

2

Nell'insegnare ai nuovi programmatori, la risposta corretta a "devo pulire?" è sempre sì. Se uno ha l'abitudine di ripulire, allora si pulirà. Quindi, quando è effettivamente necessario (per non fare confusione nel mucchio, ecc.), La pulizia è abitudine e accadrà.

La domanda migliore è "causa un problema se pulisco alla fine di questo script?" o ancora meglio ... "Supponendo che continui con uno script piuttosto lungo (o che non abbia GC disponibile), è questo il modo corretto per ripulire questi oggetti?"

i miei due centesimi. Paul