2012-10-17 42 views
6

Tôi gặp vấn đề với lập luận qua để PowerShell qua C#Làm thế nào để vượt qua đối số cho PowerShell qua C#

Tôi nhận được ngoại lệ sau đây:

"Một lệnh mà nhắc người dùng không thành công vì chương trình máy chủ hoặc loại lệnh không hỗ trợ tương tác của người dùng. Hãy thử chương trình máy chủ hỗ trợ tương tác người dùng, chẳng hạn như Bảng điều khiển Windows PowerShell hoặc Windows PowerShell ISE và xóa các lệnh liên quan khỏi các loại lệnh . chẳng hạn như Windows PowerShell công việc"

cs:

private static void RunPowershellScript(string scriptFile, string scriptParameters) 
{ 
    string scriptParameters = "param1 param2"; 

    RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create(); 
    Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration); 
    runspace.Open(); 
    RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace); 
    Pipeline pipeline = runspace.CreatePipeline(); 
    Command scriptCommand = new Command(scriptFile); 
    Collection<CommandParameter> commandParameters = new Collection<CommandParameter>(); 
    foreach (string scriptParameter in scriptParameters.Split(' ')) 
    { 
     CommandParameter commandParm = new CommandParameter(null, scriptParameter); 
     commandParameters.Add(commandParm); 
     scriptCommand.Parameters.Add(commandParm); 
    } 
    pipeline.Commands.Add(scriptCommand); 
    Collection<PSObject> psObjects; 
    psObjects = pipeline.Invoke(); 
} 

ps:

Function Foo ($arg1, $arg2) 
{ 
    Write-Host $arg1 
    Write-Host $arg2 
} 
Foo $args[0] $args[1] 

am i thiếu gì ở đây? làm thế nào tôi có thể thực hiện công việc này?

Trả lời

11

Ngoại lệ không phải là về đối số. Không sử dụng các lệnh yêu cầu giao diện người dùng máy chủ được thực hiện (bao gồm Write-Host) hoặc triển khai máy chủ lưu trữ tùy chỉnh của riêng bạn (PSHost) và giao diện người dùng này (PSHostUserInterface). Dưới đây là ví dụ về một máy chủ lưu trữ đơn giản (và có nhiều thông tin khác về MSDN về vấn đề này, nếu bạn chọn cách này): http://msdn.microsoft.com/en-us/library/windows/desktop/ee706559(v=vs.85).aspx

Để thực hiện một nhiệm vụ đơn giản với giao diện người dùng là quá nhiều. Bạn có thể xem xét đơn giản để xác định hàm Write-Host với cùng các đối số và triển khai nó để nó hoạt động trong trường hợp cụ thể của bạn (ví dụ: [Console]::WriteLine(...)). Hàm này phải được xác định trong tập lệnh hoặc được cung cấp tốt hơn theo cách khác, ví dụ: gọi một kịch bản khác với nó được định nghĩa trong phạm vi toàn cục.

P.S. Và nếu bạn có máy chủ lưu trữ tùy chỉnh của mình thì hãy sử dụng một trong số các trường hợp quá tải CreateRunspace() mất một đối tượng lưu trữ làm đối số để liên kết máy chủ và không gian chạy.

Các vấn đề liên quan