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();
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.