2010-11-14 29 views
10

Tengo un archivo PS1 con varias funciones de Powershell en él. Necesito crear una DLL estática que lea todas las funciones y sus definiciones en la memoria. A continuación, invoca una de estas funciones cuando un usuario llama a la DLL y pasa el nombre de la función y los parámetros de la función.Llamar a las funciones de Powershell desde C#

Mi pregunta es, ¿es posible hacer esto. es decir, ¿llamar a una función que ha sido leída y almacenada en la memoria?

Gracias

+0

Si desea ejecutar powershell en .NET Core, consulte [https://stackoverflow.com/questions/39141914/running-powershell-from-net-core](https://stackoverflow.com/ preguntas/39141914/running-powershell-from-net-core) – Sielu

Respuesta

4

Es posible y en más de una forma. Aquí es probablemente el más simple.

Dadas nuestras funciones están en el guión MyFunctions.ps1 (sólo uno para esta demostración):

# MyFunctions.ps1 contains one or more functions 

function Test-Me($param1, $param2) 
{ 
    "Hello from Test-Me with $param1, $param2" 
} 

A continuación, utilice el código de abajo. Es en PowerShell pero es literalmente traducible a C# (usted debe hacer eso):

# create the engine 
$ps = [System.Management.Automation.PowerShell]::Create() 

# "dot-source my functions" 
$null = $ps.AddScript(". .\MyFunctions.ps1", $false) 
$ps.Invoke() 

# clear the commands 
$ps.Commands.Clear() 

# call one of that functions 
$null = $ps.AddCommand('Test-Me').AddParameter('param1', 42).AddParameter('param2', 'foo') 
$results = $ps.Invoke() 

# just in case, check for errors 
$ps.Streams.Error 

# process $results (just output in this demo) 
$results 

Salida:

Hello from Test-Me with 42, foo 

Para más detalles de la PowerShell clase, véase:

http://msdn.microsoft.com/en-us/library/system.management.automation.powershell

+4

La pregunta es ¿cómo hacerlo en C# y usted responde cómo hacerlo en Powershell y le dice que lo traduzca él mismo a C#? Entiendo que no es terriblemente difícil, ¿pero en serio? –

+0

@Eric Brown - Cal - esta es su comprensión de la pregunta. Mi comprensión es diferente: qué métodos de PowerShell API deberían invocarse desde C#, VB.NET, F #, cualquier lenguaje .NET. –

+1

¿Estoy confundido? es el título no "Funciones de Calling Powershell de C#". ¿Me he perdido algo? –

9

Aquí está el código C# equivalente para el código mencionado anteriormente

string script = "function Test-Me($param1, $param2) { \"Hello from Test-Me with $param1, $param2\" }"; 

using (var powershell = PowerShell.Create()) 
{ 
    powershell.AddScript(script, false); 

    powershell.Invoke(); 

    powershell.Commands.Clear(); 

    powershell.AddCommand("Test-Me").AddParameter("param1", 42).AddParameter("param2", "foo"); 

    var results = powershell.Invoke(); 
} 
Cuestiones relacionadas