Kann ich ein Argument an ein VBScript übergeben (mit cscript gestartete vbs-Datei)?

85

Ich habe dieses Skript in "test.vbs" gespeichert:

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

Wenn ich das Skript ausführe, möchte ich den Wert der Variablen "workFolder" übergeben.

Wie kann ich das machen? Kann ich es schaffen? So etwas wie "cscript test.vbs workFolder: 'C: \ temp \'" vielleicht?

Bonusfrage: Ist es notwendig, die übergebene Variable mit "Set workFolder = Nothing" zu bereinigen, oder macht VBSCript das automatisch, wenn es beendet wird? Vielleicht ist "Set File = Nothing" und "Set FSO = Nothing" auch nicht notwendig? Bitte lassen Sie mich wissen, wenn Sie die Antwort auf diese beiden Fragen kennen.

Peter
quelle

Antworten:

138

Sie können WScript.Argumentsdamit auf die an Ihr Skript übergebenen Argumente zugreifen.

Aufruf des Skripts:

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

In Ihrem Skript:

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

Vergessen Sie nicht zu überprüfen, ob tatsächlich ein Argument an Ihr Skript übergeben wurde. Sie können dies tun, indem Sie die CountEigenschaft überprüfen :

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

Wenn Ihr Skript nach dem Schließen der Datei beendet ist, müssen Sie die Variablen nicht auf festlegen Nothing. Die Ressourcen werden automatisch bereinigt, wenn der Prozess cscript.exe beendet wird. Das Festlegen einer Variablen auf Nothingnormalerweise ist nur erforderlich, wenn Sie während der Ausführung Ihres Skripts explizit Ressourcen freigeben möchten. In diesem Fall würden Sie Variablen festlegen, die einen Verweis auf ein COM-Objekt enthalten Nothing, wodurch das COM-Objekt freigegeben wird, bevor Ihr Skript beendet wird. Dies ist nur eine kurze Antwort auf Ihre Bonusfrage. Weitere Informationen finden Sie in den folgenden Fragen:

Müssen Objekte in VBA-Funktionen auf Nichts gesetzt werden?

Wann muss ich in VB6 eine Variable auf „Nothing“ setzen?

Dirk Vollmar
quelle
Bingo, das war's! Sehr klar, vielen Dank. (Die Bonusfrage ist noch offen, falls jemand sie in einem dieser Kommentare beantworten möchte.)
Peter
@ Peter: Ich habe eine kurze Antwort auf Ihre Bonusfrage hinzugefügt.
Dirk Vollmar
21

Innerhalb von VBS können Sie mit auf Parameter zugreifen

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

und so weiter. Die Anzahl der Parameter:

Wscript.Arguments.Count
Oleg
quelle
Danke dir! (Die Bonusfrage ist noch offen, falls jemand sie in einem dieser Kommentare beantworten möchte.)
Peter
6

Auf jedes über die Befehlszeile übergebene Argument kann zugegriffen werden mit: Wscript.Arguments.Item (0) Dabei ist die Null die Argumentnummer: dh 0, 1, 2, 3 usw.

In Ihrem Code könnten Sie also Folgendes haben:

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

Mit wscript.arguments.count können Sie Fehler einfangen, falls jemand nicht den richtigen Wert eingibt usw.

MS Technet Beispiele

unrealtrip
quelle
Aha, danke Mann. Interessant, dass Sie keine Instanz von Wcript erstellen müssen. (Die Bonusfrage ist noch offen, falls jemand sie in einem dieser Kommentare beantworten möchte.)
Peter
1) workFolderist weder in der obigen Antwort noch in der ursprünglichen Frage als Objekt definiert, Set workFolder = Nothingsollte also einen Fehler auslösen. 2) Da das Argument nicht mehr als einmal wiederverwendet werden muss, überspringen Sie möglicherweise die Zuweisung zur strFolderVariablen. 3) Würde vorschlagen, xanstelle von 0inWscript.Arguments.Item(0)
user66001
Tatsächlich würde es keinen Fehler auslösen, wenn nicht die explizite Option festgelegt wurde, und in diesem Fall würde nichts funktionieren, da nichts definiert wurde. Das gilt für die Variable, sie wird jedoch nicht benötigt. Andererseits können weder das FSO- noch das FILE-Objekt verwendet werden, und es kann ein einfaches mit verwendet werden. Eine
Menge
1

Sie können auch benannte Argumente verwenden, die optional sind und in beliebiger Reihenfolge angegeben werden können.

Set namedArguments = WScript.Arguments.Named

Hier ist eine kleine Hilfsfunktion:

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

Beispiel VBS:

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

Anwendungsbeispiel:

test.vbs /testArg:123
tb-mtg
quelle
0

Um Ihre Bonusfrage zu beantworten, lautet die allgemeine Antwort Nein. Sie müssen keine Variablen auf "Nothing" setzen, kurz .VBS-Skripte wie Ihre, die von Wscript oder Cscript aufgerufen werden.

Der Grund, warum Sie dies möglicherweise mitten in einem längeren Skript tun, besteht darin, Speicher für das Betriebssystem freizugeben, das VB sonst gehalten hätte. Heutzutage, wenn 8 GB RAM typisch und 16 GB + relativ häufig sind, ist es unwahrscheinlich, dass dies messbare Auswirkungen hat, selbst bei einem riesigen Skript, das mehrere Megabyte in einer einzelnen Variablen enthält. Zu diesem Zeitpunkt ist es eine Art Überbleibsel aus den Tagen, als Sie möglicherweise mit 1 MB oder 2 MB RAM gearbeitet haben.

Sie haben Recht, sobald Ihr .VBS-Skript abgeschlossen ist, werden alle Ihre Variablen zerstört und der Speicher wird trotzdem zurückgefordert. Wenn Sie Variablen auf "Nichts" setzen, wird dieser Prozess einfach beschleunigt und Sie können ihn mitten in einem Skript ausführen.

Geoff Griswald
quelle