簡體   English   中英

C#中的Powershell管道和Foreach對象

[英]Powershell Pipe and Foreach-Object in c#

我正在調用office365的get-msoluser cmdlet,並且在Powershell中使用以下cmdlet

 Get-MsolUser -UserPrincipalName user@organization.onmicrosoft.com | ForEach-Object{ $_.licenses}

輸出是許可證的集合,我希望在C#中運行相同的腳本。 所以我寫的代碼如下

private void displayLicenses(){
     Command cmd = new Command("Get-MsolUser");
     cmd.Parameters.Add("UserPrincipalName","user@organization.onmicrosoft.com");
     Command cmd2 = new Command("ForEach-Object");
     cmd2.Parameters.Add("$_.licenses.AccountSku");
     Pipeline pipe = Office365Runspace.CreatePipeline();
     pipe.Commands.Add(cmd);
     pipe.Commands.Add(cmd2);
     Console.WriteLine("Before invoking the pipe");
     ICollection<PSObject> result = pipe.Invoke();
     CheckForErrors(pipe);
     Console.WriteLine("Executed command {0} + {1} with no error", cmd.CommandText, cmd2.CommandText);
      foreach(PSObject obj in result){
            foreach(PSPropertyInfo propInfo in obj.Properties){
                Console.WriteLine(propInfo.Name+": "+propInfo.Value+" "+propInfo.MemberType);
          }
     }
}

但是我在執行此功能時仍然遇到錯誤

未處理的異常:System.Management.Automation.CommandNotFoundException:術語'ForEach-Object'不被識別為cmdlet,函數,腳本文件或可運行程序的名稱。 檢查名稱的拼寫,或者是否包含路徑,請確認路徑正確,然后重試。

我檢查了我的項目是否對包含ForEach-Object cmdlet的System.management.Automation.dll文件進行了引用。

我在Powershell中使用此cmd找到了dll

(Get-Command ForEach-Object).dll

謝謝,薩蒂亞

我找出導致問題的原因。 這是由於我創建的運行空間配置錯誤。

    InitialSessionState initalState = InitialSessionState.Create();
    initalState.ImportPSModule(new String[] { "msonline" });
    //initalState.LanguageMode = PSLanguageMode.FullLanguage;

    Office365Runspace = RunspaceFactory.CreateRunspace(initalState);
    Office365Runspace.Open();

我創建的初始狀態為空,當我將其更改為默認狀態時,它可以正常工作。創建默認狀態時,它包括默認情況下獲得的所有模塊。

  InitialSessionState initalState = InitialSessionState.CreateDefault();

工作正常。

謝謝,薩蒂亞

聽起來您正在嘗試在Exchange服務器的遠程會話中運行它。 這些是NoLanguage受限的會話,這意味着您只能在這些會話中運行Exchange cmdlet。 如果要使用PowerShell核心語言cmdlet(例如foreach-object),則必須在本地會話中執行此操作,並使用Import-PSSession將Exchange函數導入到本地會話中(隱式遠程處理),或使用Invoke-Command並將其指向Exchange服務器上的遠程會話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM