[英]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.