¿Puedo pasar un argumento a un VBScript (archivo vbs iniciado con cscript)?

85

Tengo este script guardado en "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

Cuando ejecuto el script, quiero pasar el valor de la variable "workFolder".

¿Cómo puedo hacer esto? ¿Puedo hacerlo? ¿Algo como "cscript test.vbs workFolder: 'C: \ temp \'" quizás?

Pregunta adicional: ¿Es necesario limpiar la variable pasada con "Set workFolder = Nothing" o VBSCript lo hace automáticamente cuando termina? ¿Quizás "Set File = Nothing" y "Set FSO = Nothing" también sean innecesarios? Por favor, avíseme si conoce la respuesta a ambas preguntas.

Pedro
fuente

Respuestas:

138

Puede utilizar WScript.Argumentspara acceder a los argumentos pasados ​​a su script.

Llamando al guión:

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

Dentro de su guión:

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

No olvide comprobar si realmente se ha pasado un argumento a su script. Puede hacerlo marcando la Countpropiedad:

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

Si su secuencia de comandos finaliza después de cerrar el archivo, entonces no es necesario establecer las variables en Nothing. Los recursos se limpiarán automáticamente cuando finalice el proceso cscript.exe. Establecer una variable en Nothingnormalmente solo es necesario si desea liberar recursos explícitamente durante la ejecución de su script. En ese caso, establecería variables que contienen una referencia a un objeto COM Nothing, lo que liberaría el objeto COM antes de que finalice su script. Esta es solo una breve respuesta a su pregunta adicional, encontrará más información en estas preguntas relacionadas:

¿Es necesario establecer objetos en Nothing dentro de las funciones de VBA?

¿Cuándo debo establecer una variable en "Nada" en VB6?

Dirk Vollmar
fuente
¡Bingo, eso es todo! Muy claro, muchas gracias. (La pregunta adicional aún está abierta en caso de que alguien quiera responderla en uno de estos comentarios.)
Peter
@Peter: agregué una respuesta corta a tu pregunta adicional.
Dirk Vollmar
21

Dentro de VBS puede acceder a los parámetros con

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

y así. El número de parámetro:

Wscript.Arguments.Count
Oleg
fuente
¡Gracias! (La pregunta de bonificación todavía está abierta por si alguien quiere responder en uno de estos comentarios.)
Pedro
6

Se puede acceder a cada argumento pasado a través de la línea de comando con: Wscript.Arguments.Item (0) Donde el cero es el número de argumento: es decir, 0, 1, 2, 3, etc.

Entonces en su código podría tener:

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

Con wscript.arguments.count, puede capturar errores en caso de que alguien no ingrese el valor adecuado, etc.

Ejemplos de MS Technet

irreal viaje
fuente
Ajá, gracias tío. Es interesante que no tenga que crear una instancia de Wcript. (La pregunta adicional aún está abierta en caso de que alguien quiera responderla en uno de estos comentarios.)
Peter
1) workFolderno está definido como un objeto ni en la respuesta anterior ni en la pregunta original, por lo que Set workFolder = Nothingdebería generar un error. 2) Como no se sugiere que el argumento deba reutilizarse más de una vez, tal vez omita asignarlo a la strFoldervariable. 3) Sugeriría usar en xlugar de 0enWscript.Arguments.Item(0)
user66001
En realidad, no generaría un error a menos que se estableciera una opción explícita, y en ese caso nada funcionaría ya que no se ha definido nada. Eso es cierto acerca de la variable, sin embargo, no es necesario, entonces tampoco lo son los objetos FSO o FILE y se podría usar un simple con. Un montón de enfoques diferentes posibles ... :)
unrealtrip
2

También puede usar argumentos con nombre que son opcionales y se pueden dar en cualquier orden.

Set namedArguments = WScript.Arguments.Named

Aquí hay una pequeña función de ayuda:

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

Ejemplo de VBS:

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

Ejemplo de uso:

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

Para responder a su pregunta adicional, la respuesta general es no, no es necesario establecer las variables en "Nada" en breves scripts .VBS como el suyo, que son llamados por Wscript o Cscript.

La razón por la que podría hacer esto en medio de una secuencia de comandos más larga es para liberar memoria al sistema operativo que, de otro modo, VB habría estado reteniendo. En estos días, cuando 8GB de RAM son típicos y 16GB + relativamente comunes, es poco probable que esto produzca un impacto medible, incluso en un script enorme que tiene varios megabytes en una sola variable. En este punto, es una especie de retención de los días en los que podría haber estado trabajando con 1 MB o 2 MB de RAM.

Tiene razón, en el momento en que se completa su script .VBS, todas sus variables se destruyen y la memoria se recupera de todos modos. Establecer variables en "Nada" simplemente acelera ese proceso y le permite hacerlo en medio de un script.

Geoff Griswald
fuente