Posso passar um argumento para um VBScript (arquivo vbs iniciado com cscript)?

85

Tenho este script salvo em "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 executo o script, desejo passar o valor da variável "workFolder".

Como posso fazer isso? Posso fazer isso? Algo como "cscript test.vbs workFolder: 'C: \ temp \'" talvez?

Pergunta bônus: É necessário limpar a variável passada com "Set workFolder = Nothing" ou o VBSCript faz isso automaticamente quando termina? Talvez "Set File = Nothing" e "Set FSO = Nothing" também sejam desnecessários? Informe-nos se souber a resposta a essas duas perguntas.

Peter
fonte

Respostas:

138

Você pode usar WScript.Argumentspara acessar os argumentos passados ​​para o seu script.

Chamando o script:

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

Dentro do seu script:

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

Não se esqueça de verificar se realmente houve um argumento passado para o seu script. Você pode fazer isso verificando a Countpropriedade:

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

Se o seu script terminar depois de fechar o arquivo, não há necessidade de definir as variáveis ​​para Nothing. Os recursos serão limpos automaticamente quando o processo cscript.exe terminar. Definir uma variável como Nothinggeralmente só é necessário se você deseja explicitamente liberar recursos durante a execução do seu script. Nesse caso, você definiria variáveis ​​que contêm uma referência a um objeto COM para Nothing, o que liberaria o objeto COM antes que seu script terminasse. Esta é apenas uma resposta curta à sua pergunta bônus. Você encontrará mais informações nestas perguntas relacionadas:

É necessário definir Objetos como Nada nas Funções do VBA

Quando devo definir uma variável como “Nothing” no VB6?

Dirk Vollmar
fonte
Bingo, é isso! Muito claro, muito obrigado. (A pergunta bônus ainda está aberta, caso alguém queira respondê-la em um desses comentários.)
Peter
@ Peter: Eu adicionei uma resposta curta à sua pergunta bônus.
Dirk Vollmar
21

Dentro do VBS você pode acessar parâmetros com

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

e assim por diante. O número do parâmetro:

Wscript.Arguments.Count
Oleg
fonte
Obrigado! (A pergunta bônus ainda está aberta, caso alguém queira respondê-la em um desses comentários.)
Peter
6

Cada argumento passado via linha de comando pode ser acessado com: Wscript.Arguments.Item (0) Onde o zero é o número do argumento: ou seja, 0, 1, 2, 3 etc.

Portanto, em seu código, você poderia ter:

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

Usando wscript.arguments.count, você pode fazer uma armadilha de erro caso alguém não insira o valor adequado etc.

Exemplos de MS Technet

irreal
fonte
Aha, obrigado cara. Interessante que você não precisa criar uma instância de Wcript. (A pergunta bônus ainda está aberta, caso alguém queira respondê-la em um desses comentários.)
Peter
1) workFoldernão é definido como um objeto na resposta acima ou na pergunta original, portanto, Set workFolder = Nothingdeve gerar um erro. 2) Como o argumento não é sugerido como precisando ser reutilizado mais de uma vez, talvez ignore atribuí-lo à strFoldervariável. 3) x0Wscript.Arguments.Item(0)
Sugeria
Na verdade, ele não geraria um erro a menos que a opção explícita fosse definida e, nesse caso, nada funcionaria, uma vez que nada foi definido. Isso é verdade sobre a variável, entretanto, não é necessário, então, novamente, nem o são os objetos FSO ou FILE e um simples com poderia ser usado. Uma tonelada de abordagens diferentes possíveis ... :)
unrealtrip
2

Você também pode usar argumentos nomeados que são opcionais e podem ser fornecidos em qualquer ordem.

Set namedArguments = WScript.Arguments.Named

Aqui está uma pequena função auxiliar:

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

Exemplo VBS:

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

Exemplo de uso:

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

Para responder à sua pergunta bônus, a resposta geral é não, você não precisa definir as variáveis ​​como "Nada" em scripts .VBS curtos como o seu, que são chamados por Wscript ou Cscript.

O motivo pelo qual você pode fazer isso no meio de um script mais longo é liberar memória de volta para o sistema operacional que o VB teria mantido. Hoje em dia, quando 8 GB de RAM é típico e 16 GB + relativamente comum, é improvável que isso produza qualquer impacto mensurável, mesmo em um script enorme que tem vários megabytes em uma única variável. Neste ponto, é uma espécie de atraso dos dias em que você trabalhava com 1 MB ou 2 MB de RAM.

Você está correto, no momento em que seu script .VBS é concluído, todas as suas variáveis ​​são destruídas e a memória é recuperada de qualquer maneira. Definir as variáveis ​​como "Nada" simplesmente acelera esse processo e permite que você faça isso no meio de um script.

Geoff Griswald
fonte