c#中的Powershell管道和Foreach-Object

时间:2014-01-23 07:24:59

标签: c# powershell foreach office365 powershell-remoting

我正在调用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

谢谢, 萨蒂亚

2 个答案:

答案 0 :(得分:1)

我找出了造成这个问题的问题。这是由于我创建了错误配置的运行空间。

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

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

我正在用空的创建initalstate,当我将其更改为默认值时,它工作正常。在创建默认值时,它包含默认获取的所有模块。

  InitialSessionState initalState = InitialSessionState.CreateDefault();

它运作良好。

谢谢, 萨蒂亚

答案 1 :(得分:0)

听起来你正试图在Exchange服务器的远程会话中运行它。这些是NoLanguage约束会话,这意味着您只能在这些会话中运行Exchange cmdlet。如果要使用PowerShell核心语言cmdlet(如foreach-object),则必须在本地会话中执行此操作,并使用Import-PSSession将Exchange函数导入本地会话(隐式远程处理),或使用Invoke-Command并将其指向Exchange服务器上的远程会话。