Czy mogę przekazać argument do VBScript (plik vbs uruchamiany za pomocą cscript)?

85

Mam ten skrypt zapisany w „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

Po uruchomieniu skryptu chcę przekazać wartość zmiennej „workFolder”.

Jak mogę to zrobić? Czy mogę to zrobić? Może coś w rodzaju „cscript test.vbs workFolder: 'C: \ temp \'”?

Pytanie dodatkowe: czy konieczne jest wyczyszczenie przekazanej zmiennej za pomocą polecenia „Set workFolder = Nothing”, czy też VBSCript robi to automatycznie po zakończeniu? Może „Set File = Nothing” i „Set FSO = Nothing” też są niepotrzebne? Daj mi znać, jeśli znasz odpowiedź na oba te pytania.

Piotr
źródło

Odpowiedzi:

138

Możesz użyć WScript.Arguments aby uzyskać dostęp do argumentów przekazanych do twojego skryptu.

Wywołanie skryptu:

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

W twoim skrypcie:

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

Nie zapomnij sprawdzić, czy rzeczywiście został przekazany argument do twojego skryptu. Możesz to zrobić, sprawdzając Countnieruchomość:

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

Jeśli skrypt się skończył po zamknięciu pliku, nie ma potrzeby ustawiania zmiennych na Nothing. Zasoby zostaną wyczyszczone automatycznie po zakończeniu procesu cscript.exe. Ustawienie zmiennej na Nothingzwykle jest konieczne tylko wtedy, gdy jawnie chcesz zwolnić zasoby podczas wykonywania skryptu. W takim przypadku należy ustawić zmienne, które zawierają odniesienie do obiektu COM Nothing, co spowoduje zwolnienie obiektu COM przed zakończeniem skryptu. To tylko krótka odpowiedź na pytanie dotyczące premii, więcej informacji znajdziesz w następujących powiązanych pytaniach:

Czy istnieje potrzeba ustawienia obiektów na Niczego w funkcjach VBA?

Kiedy muszę ustawić zmienną na „Nothing” w VB6?

Dirk Vollmar
źródło
Bingo, to wszystko! Bardzo jasne, wielkie dzięki. (Pytanie dodatkowe jest nadal otwarte na wypadek, gdyby ktoś chciał na nie odpowiedzieć w jednym z tych komentarzy.)
Peter
@Peter: Dodałem krótką odpowiedź na Twoje dodatkowe pytanie.
Dirk Vollmar
21

Wewnątrz VBS można uzyskać dostęp do parametrów za pomocą

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

i tak dalej. Liczba parametrów:

Wscript.Arguments.Count
Oleg
źródło
Dziękuję Ci! (Pytanie dodatkowe jest nadal otwarte na wypadek, gdyby ktoś chciał na nie odpowiedzieć w jednym z tych komentarzy.)
Peter
6

Dostęp do każdego argumentu przekazanego w linii poleceń można uzyskać za pomocą: Wscript.Arguments.Item (0) Gdzie zero jest numerem argumentu: tj. 0, 1, 2, 3 itd.

Więc w swoim kodzie możesz mieć:

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

Korzystając z wscript.arguments.count, możesz błędnie przechwycić pułapkę na wypadek, gdyby ktoś nie wprowadził prawidłowej wartości itp.

Przykłady MS Technet

unrealtrip
źródło
Aha, dzięki stary. Ciekawe, że nie musisz tworzyć instancji Wcript. (Pytanie dodatkowe jest nadal otwarte na wypadek, gdyby ktoś chciał na nie odpowiedzieć w jednym z tych komentarzy.)
Peter
1) workFoldernie jest zdefiniowany jako przedmiot ani w powyższej odpowiedzi, ani w pierwotnym pytaniu, więc Set workFolder = Nothingpowinno powodować błąd. 2) Ponieważ argument nie jest sugerowany jako wymagający ponownego użycia więcej niż jeden raz, może pomiń przypisanie go do strFolderzmiennej. 3) Sugerowałbym używanie xzamiast 0inWscript.Arguments.Item(0)
user66001
W rzeczywistości nie spowodowałoby to błędu, chyba że ustawiono opcję jawną, aw takim przypadku nic nie zadziała, ponieważ nic nie zostało zdefiniowane. To prawda, jeśli chodzi o zmienną, jednak nie jest ona potrzebna, z drugiej strony nie są też obiekty FSO lub FILE i można użyć prostego with. Możliwe mnóstwo różnych podejść ... :)
unrealtrip
2

Możesz także użyć nazwanych argumentów, które są opcjonalne i mogą być podawane w dowolnej kolejności.

Set namedArguments = WScript.Arguments.Named

Oto mała funkcja pomocnicza:

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

Przykład VBS:

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

Przykładowe zastosowanie:

test.vbs /testArg:123
tb-mtg
źródło
0

Aby odpowiedzieć na Twoje dodatkowe pytanie, ogólna odpowiedź brzmi: nie, nie musisz ustawiać zmiennych na „Nothing” w krótkich skryptach .VBS, takich jak twój, które są wywoływane przez Wscript lub Cscript.

Powodem, dla którego możesz to zrobić w środku dłuższego skryptu, jest zwolnienie pamięci z powrotem do systemu operacyjnego, którą w innym przypadku przechowywałby VB. W dzisiejszych czasach, gdy 8 GB pamięci RAM jest typowe i 16 GB + stosunkowo powszechne, jest mało prawdopodobne, aby miało to jakikolwiek wymierny wpływ, nawet na ogromny skrypt, który ma kilka megabajtów w jednej zmiennej. W tym momencie jest to trochę wstrzymanie od dni, w których mogłeś pracować w 1 MB lub 2 MB pamięci RAM.

Masz rację, w momencie zakończenia skryptu .VBS wszystkie twoje zmienne zostają zniszczone, a pamięć i tak zostaje odzyskana. Ustawienie zmiennych na „Nothing” po prostu przyspiesza ten proces i pozwala na zrobienie tego w środku skryptu.

Geoff Griswald
źródło