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.

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?


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

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


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.