2012-04-21 32 views
6

Tengo un script de PowerShell almacenado en un archivo. En Windows PowerShell, ejecuto el script como
.\MergeDocuments.ps1 "1.docx" "2.docx" "merge.docx"Invocar secuencia de comandos de PowerShell con argumentos de C#

Quiero llamar al script desde C#. Actualmente estoy usando Process.Start de la siguiente manera, que funciona a la perfección:
Process.Start(POWERSHELL_PATH, string.Format("-File \"{0}\" {1} {2}", SCRIPT_PATH, string.Join(" ", filesToMerge), outputFilename));

que desea que se ejecute utilizando Pipeline clase, algo así como el código de abajo, pero no sé cómo pasar los argumentos (tenga en cuenta que no tengo argumentos con nombre, sólo estoy usando $ args)

// create Powershell runspace 
Runspace runspace = RunspaceFactory.CreateRunspace(); 
runspace.Open(); 

RunspaceInvoke runSpaceInvoker = new RunspaceInvoke(runspace); 
runSpaceInvoker.Invoke("Set-ExecutionPolicy Unrestricted"); 

// create a pipeline and feed it the script text (AddScript method) or use the filePath (Add method) 
Pipeline pipeline = runspace.CreatePipeline(); 
Command command = new Command(SCRIPT_PATH); 
command.Parameters.Add("", ""); // I don't have named paremeters 
pipeline.Commands.Add(command); 

pipeline.Invoke(); 
runspace.Close(); 
+0

cualquier solución final con código fuente completo? – Kiquenet

+1

@Kiquenet Agregó el código. –

Respuesta

13

lo encontramos en uno de los comentarios a otra pregunta

con el fin de pasar argumentos a los $ args pasar null como el nombre del parámetro, p. ej. command.Parameters.Add(null, "some value");

El script se llama como:
.\MergeDocuments.ps1 "1.docx" "2.docx" "merge.docx"

Aquí está el código completo:

class OpenXmlPowerTools 
{ 
    static string SCRIPT_PATH = @"..\MergeDocuments.ps1"; 

    public static void UsingPowerShell(string[] filesToMerge, string outputFilename) 
    { 
     // create Powershell runspace 
     Runspace runspace = RunspaceFactory.CreateRunspace(); 
     runspace.Open(); 

     RunspaceInvoke runSpaceInvoker = new RunspaceInvoke(runspace); 
     runSpaceInvoker.Invoke("Set-ExecutionPolicy Unrestricted"); 

     // create a pipeline and feed it the script text 
     Pipeline pipeline = runspace.CreatePipeline(); 
     Command command = new Command(SCRIPT_PATH); 
     foreach (var file in filesToMerge) 
     { 
      command.Parameters.Add(null, file); 
     } 
     command.Parameters.Add(null, outputFilename); 
     pipeline.Commands.Add(command); 

     pipeline.Invoke(); 
     runspace.Close(); 
    } 
}
+0

Realmente deseo que me haya funcionado. Sigo recibiendo la misma excepción ParameterBindingException. No se manejó el error al intentar algo como esto. No tiene sentido. –

+0

Si intenta hacer "" en lugar de nulo, entonces funcionará. Entonces no obtendrás esa ParameterBindingException –

Cuestiones relacionadas