2012-04-21 16 views
6

Ich habe ein PowerShell-Skript in einer Datei gespeichert. In Windows Powershell ausführen ich das Skript als
.\MergeDocuments.ps1 "1.docx" "2.docx" "merge.docx"Aufrufen von PowerShell-Skript mit Argumenten aus C#

ich das Drehbuch von C# aufrufen möchten. Derzeit ich Process.Start bin mit wie folgt die einwandfrei funktioniert:
Process.Start(POWERSHELL_PATH, string.Format("-File \"{0}\" {1} {2}", SCRIPT_PATH, string.Join(" ", filesToMerge), outputFilename));

ich es mit Pipeline Klasse ausgeführt werden soll, so etwas wie den Code unten, aber ich weiß nicht, wie die Argumente zu übergeben (bedenken Sie, dass ich habe keine benannten Argumente, ich bin $ args nur mit)

// 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

eine endgültige Lösung mit vollständigem Source? – Kiquenet

+1

@Kiquenet Der Code wurde hinzugefügt. –

Antwort

13

fand es nur in einer der Kommentare auf eine andere Frage

um Argumente an die $ args passieren passieren null wie die Parametername, z command.Parameters.Add(null, "some value");

wird das Skript aufgerufen wie:
.\MergeDocuments.ps1 "1.docx" "2.docx" "merge.docx"

Hier wird der vollständige Code ist:

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

Ich wünschte wirklich, dass das für mich funktioniert hat. Ich bekomme immer noch die gleiche ParameterBindingException wurde unbehandelt Fehler versucht, so etwas. Das macht keinen Sinn. –

+0

Wenn Sie versuchen, "" anstelle von null zu machen, wird es funktionieren. Dann erhalten Sie diese ParameterBindingException nicht –

Verwandte Themen