Ejecutar Script

27/05/2005 - 17:28 por Víctor | Informe spam
Hola

necesito ejecutar un script desde c#. El contenido de un fichero que
contiene código para mostrar el cuadro de apagado de windows es el
siguiente:

Option Explicit

Dim Shell

Set Shell = WScript.CreateObject ("Shell.Application")

Shell.ShutdownWindows

WScript.Quit()


He estado buscando clases para ejecutar comandos de script directamente,
pero no he sido capaz de hacerlo. Ahora mismo estoy ejecutando las ordenes
metiendolas en un archivo de script y ejecutando el archivo mediante:

Process.Start(Application.StartupPath + \\shutd.vbs);

Si alguien sabe la forma de ejecutar directamente el código, o la forma de
mostrar el cuadro de otra forma (mediante el paso de algún parametro a
rundll32, por ejemplo), agradecería me lo comentase.

Muchas gracias.

Preguntas similare

Leer las respuestas

#1 Tristan
28/05/2005 - 01:12 | Informe spam
No se si tu pregunta va dedicada a como ejecutar en general código vbscript
desde C#, o a como ejecutar desde C# la operación del ShutdownWindows.

Empezaré por la forma de ejecutar el mismo código pero sin vbscript. Basta
con hacer uso desde C# del mismo componente Shell.Application de tu código
vbscript:

using System.Reflection;
...
Type tipoShell = Type.GetTypeFromProgID("Shell.Application", true);
object shell = Activator.CreateInstance(tipoShell);
tipoShell.InvokeMember("ShutdownWindows", BindingFlags.InvokeMethod, null,
shell, null);

Las dos primeras lineas serían el equivalente al CreateObject. La tercera es
la llamada a ShutdownWindows.


Por otro lado, lo que realmente preguntabas. Como ejecutar código vbscript
desde C#.

Puedes hacer uso del control COM Microsoft Script Control:

string codigo = "for i = 1 to 10: msgbox(i): next";
Type tipoScript = Type.GetTypeFromProgID("MSScriptControl.ScriptControl",
true);
object script = Activator.CreateInstance(tipoScript);
tipoScript.InvokeMember("Language", BindingFlags.SetProperty, null, script,
new object[] {"VBScript"});
tipoScript.InvokeMember("AddCode", BindingFlags.InvokeMethod, null, script,
new object[] {codigo});

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#2 Víctor
28/05/2005 - 01:43 | Informe spam
Muchas gracias. Me ha sido de gran utilidad
Respuesta Responder a este mensaje
#3 Tristan
28/05/2005 - 14:01 | Informe spam
Por cierto, aprovecho ya que te ha servido el ejemplo. Como no me gusta
demasiado como está diseñado reflection, te propongo utilizar la siguiente
clase, a la que he llamado Com. Sirve de envoltorio para utilizar
componentes COM de una forma algo más intuitiva y legible:

Con esta clase, tu código de apagado quedaría así:

Com shell = Com.CreateObject("Shell.Application");
shell.Invoke("ShutdownWindows");


Y el código para ejecutar vbscript;

Com script = Com.CreateObject("MSScriptControl.ScriptControl");
script["Language"] = "VBScript";
string codigo = "for i = 1 to 10: msgbox(i): next";
script.Invoke("AddCode", codigo);


Más legible, ¿no?


La clase sería esta:

class Com
{
private object objeto;
private Type tipo;

public static Com CreateObject(string @class)
{
Com o = new Com();
o.tipo = Type.GetTypeFromProgID(@class, true);
o.objeto = Activator.CreateInstance(o.tipo);
return o;
}

public object Invoke(string methodName, params object[] parameters)
{
return tipo.InvokeMember(methodName, BindingFlags.InvokeMethod,
null, objeto, parameters);
}

public object this[string propertyName]
{
set
{
tipo.InvokeMember(
propertyName, BindingFlags.SetProperty, null, objeto, new
object[] {value});
}
get
{
return tipo.InvokeMember(
propertyName, BindingFlags.GetProperty, null, objeto, null);
}
}
}

Juan Carlos Badiola
MVP - C#
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida