ventajas vbs examples ejemplos desventajas descargar archivos vbscript arguments wsh

examples - vbscript pdf



Forzar un VBS para que se ejecute utilizando cscript en lugar de wscript (5)

Aquí está mi fragmento de código que utilizo para algunos de mis scripts. Maneja Argumentos también . Todo lo que tienes que hacer es reemplazar {EnterWorC} con una "w" o "c" con comillas

Dim WorC, Command, Arguments, I WorC={EnterWOrC} ''Make sure you replace "{EnterWOrC}" with a "w" or a "c" and BE SURE TO PUT QUOTES AROUND THE LETTER. WorC=LCase (WorC) If lcase (WorC)="w" Or lcase (WorC)="c" Then If LCase (Right (WScript.FullName,11))<> WorC & "script.exe" Then command=WScript.ScriptFullName Arguments="" For I=0 To UBound (WScript.Arguments) Arguments=Arguments & Chr (34) & WScript.Arguments(I) & Chr (34) & Space (1) Next CreateObject("Wscript.Shell").Run WorC & "script.exe " & Chr (34) & command & Chr (34) & Space (1) & Arguments, 1 WScript.Quit End If WorC=Empty Command=Empty I=Empty Arguments=Empty End If

Aquí tendrá que reemplazar la 2ª línea (2ª línea NO en blanco)

WorC={EnterWOrC} ''Make sure you replace "{EnterWOrC}" with a "w" or a "c" and BE SURE TO PUT QUOTES AROUND THE LETTER.

Para Wscript: WorC="W"

Para CScript: WorC="C"

NO es sensible a mayúsculas.

¿Cuál es el método aprobado (y, por lo tanto, correcto) de stackoverflow para forzar que un VBS se ejecute utilizando cscript en lugar de wscript, independientemente de lo que intente el usuario?

Una búsqueda rápida en Google muestra muchos ejemplos, pero algunos de ellos simplemente no funcionan y los que no lo hacen a menudo no pueden manejar el hecho de que se haya ejecutado con argumentos, así que estoy ansioso por saber cuál es la mejor manera.

Aquí hay un ejemplo que no maneja argumentos:

sExecutable = LCase(Mid(Wscript.FullName, InstrRev(Wscript.FullName,"/")+1)) If sExecutable <> "cscript.exe" Then Set oShell = CreateObject("wscript.shell") oShell.Run "cscript.exe """ & Wscript.ScriptFullName & """" Wscript.Quit End If

Aprecio que esto probablemente pueda modificarse fácilmente para manejar los argumentos, pero me doy cuenta de que esta puede no ser la mejor manera de abordar el problema.

Antecedentes: estoy escribiendo un script que puede ejecutarse haciendo doble clic o (lo más probable) desde un archivo por lotes de DOS o como una tarea programada. Puede contener uno o más argumentos de línea de comando opcionales.


Aquí hay uno similar en JScript para hacer que los archivos .js se ejecuten en CScript:

(function(ws) { if (ws.fullName.slice(-12).toLowerCase() !== ''//cscript.exe'') { var cmd = ''cscript.exe //nologo "'' + ws.scriptFullName + ''"''; var args = ws.arguments; for (var i = 0, len = args.length; i < len; i++) { var arg = args(i); cmd += '' '' + (~arg.indexOf('' '') ? ''"'' + arg + ''"'' : arg); } new ActiveXObject(''WScript.Shell'').run(cmd); ws.quit(); } })(WScript); WScript.echo(''We are now in CScript. Press Enter to Quit...''); WScript.stdIn.readLine();

https://gist.github.com/4482361


Dos pequeñas adiciones a forceCScriptExecution me permiten ver su ventana después de la terminación y manejar su código de retorno.

Sub forceCScriptExecution Dim Arg, Str If Not LCase( Right( WScript.FullName, 12 ) ) = "/cscript.exe" Then For Each Arg In WScript.Arguments If InStr( Arg, " " ) Then Arg = """" & Arg & """" Str = Str & " " & Arg Next **ret =** CreateObject( "WScript.Shell" ).Run **("cmd /k** cscript //nologo """ & WScript.ScriptFullName & """ " & Str**,1,true)** WScript.Quit **ret** End If End Sub

Notas: "cmd / k" deja que las ventanas permanezcan después de la ejecución. El parámetro "1" activa la ventana. El parámetro "verdadero" espera la terminación, por lo que la variable "ret" puede devolver el código de error.


Mi señor, qué basura no adulterada. Me hace llorar al ver una codificación tan cruda (sin ofender a nadie, jajaja). En serio, sin embargo, aquí está mi 2 peniques:

Sub forceCScriptExecution Dim Arg, Str If Not LCase( Right( WScript.FullName, 12 ) ) = "/cscript.exe" Then For Each Arg In WScript.Arguments If InStr( Arg, " " ) Then Arg = """" & Arg & """" Str = Str & " " & Arg Next CreateObject( "WScript.Shell" ).Run _ "cscript //nologo """ & _ WScript.ScriptFullName & _ """ " & Str WScript.Quit End If End Sub forceCScriptExecution

Maneja los argumentos, Y verifica los espacios en dichos argumentos, de modo que en el caso de un nombre de archivo pasado a la instancia de script original que contenía espacios, no se "tokenizaría" cuando se pasa a cscript.exe.

Lo único que no hace es probar StdIn (por ejemplo, en el caso de que alguien haya enviado algo al script a través de la línea de comandos, pero se olvidó de usar "cscript script.vbs"), pero si fue ejecutado por WScript. exe, todos los métodos de WScript.StdIn devuelven errores de Manejo no válido, por lo que no hay manera de probar eso de todos modos.

No dude en hacerme saber si hay una manera de "romper" esto; Estoy dispuesto a mejorarlo si es necesario.


Un enfoque podría ser darle otra extensión en lugar de .vbs. Di .cvbs por ejemplo. Asocie .cvbs con cscript.exe, no con wscript.exe, de esa forma, ejecutar o hacer doble clic en un archivo .cvbs nunca invocará a wscript.exe.