2012-04-21 5 views
6

У меня есть сценарий PowerShell, хранящийся в файле. В Windows PowerShell я запускаю сценарий как
.\MergeDocuments.ps1 "1.docx" "2.docx" "merge.docx"Вызов скрипта PowerShell с аргументами из C#

Я хочу вызвать скрипт из C#. В настоящее время я использую Process.Start следующим образом, который отлично работает:
Process.Start(POWERSHELL_PATH, string.Format("-File \"{0}\" {1} {2}", SCRIPT_PATH, string.Join(" ", filesToMerge), outputFilename));

Я хочу, чтобы запустить его с помощью Pipeline класса, что-то вроде кода ниже, но я не знаю, как передать аргументы (имейте в виду, что у меня нет именованных аргументов, я просто с помощью $ арг)

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

любое окончательное решение с полным исходным кодом? – Kiquenet

+1

@Kiquenet Добавил код. –

ответ

13

Просто нашел его в одном из комментариев к другому вопросу

для того, чтобы передать аргументы в $ арг проходят нуль как имя параметра, например command.Parameters.Add(null, "some value");

Сценарий называется:
.\MergeDocuments.ps1 "1.docx" "2.docx" "merge.docx"

Вот полный код:

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

Мне очень жаль, что это сработало для меня. Я все равно получаю тот же параметр ParameterBindingException, что была необработанная ошибка, пытающаяся что-то вроде этого. Это не имеет никакого смысла. –

+0

Если вы попробуете сделать "" вместо null, то он будет работать. Тогда вы не получите это ParameterBindingException –

Смежные вопросы