2011-09-27 58 views
0

如果我尝试通过c#运行Powershell命令,我得到以下错误: “术语'select'不被识别为cmdlet函数的名称,脚本文件或可操作程序,检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。使用文字和代码块与c#与PowerShell 2.0交互的问题

如果命令直接执行Powershell(.exe)一切正常!

我尝试运行的命令看起来像IG: “获取邮箱 - 组织'CoolOrganizationNameGoesHere' |选择ServerName

似乎有与“管”的问题|, 我已经浪费了时间上在主要搜索引擎搜索最疯狂的关键字组合, ,但我没有发现任何可行的。

我试过的最后一件事情是将IIS-ApplicationPSLanguageMode属性设置为Powershell,结果与前面写的一样。

也许有WinRM配置错误?或者我的本地Powershell配置已损坏? 是否有任何关于C#(或任何其他.Net语言)使用Powershell远程访问 以及使用Pipe | “命令”?

有人可以告诉我什么是错,这就像在大海捞针!

谢谢!

+0

请发布sampl e代码完全展示了你如何试图从C#调用Powershell脚本。 – paulsm4

回答

2

窍门可能是你创建你的命令的方式。如果你正在运行脚本作为一个字符串,你应该使用:

Command myCommand = new Command(script, true); 

但是,如果你想运行它作为一个文件名 - 你应该使用:

Command myCommand = new Command(script, false); 

所以:

Command myCommand = new Command("Get-Date", true); 
Command myCommand = new Command("c:\test.ps1", false); 

如果您需要完整的方法:

private static IEnumerable<PSObject> ExecutePowerShellScript(string script, bool isScript = false, IEnumerable<KeyValuePair<string, object>> parameters = null) 
{ 
    RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create(); 
    Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration); 
    runspace.Open(); 

    Command myCommand = new Command(script, isScript); 
    if (parameters != null) 
     { 
      foreach (var parameter in parameters) 
      { 
       myCommand.Parameters.Add(new CommandParameter(parameter.Key, parameter.Value)); 
      } 
     } 
    Pipeline pipeline = runspace.CreatePipeline(); 

    pipeline.Commands.Add(myCommand); 
    var result = pipeline.Invoke(); 

    // Check for errors 
    if (pipeline.Error.Count > 0) 
     { 
      StringBuilder builder = new StringBuilder(); 
      //iterate over Error PipeLine until end 
      while (!pipeline.Error.EndOfPipeline) 
      { 
       //read one PSObject off the pipeline 
       var value = pipeline.Error.Read() as PSObject; 
       if (value != null) 
       { 
        //get the ErrorRecord 
        var r = value.BaseObject as ErrorRecord; 
        if (r != null) 
        { 
         //build whatever kind of message your want 
         builder.AppendLine(r.InvocationInfo.MyCommand.Name + " : " + r.Exception.Message); 
         builder.AppendLine(r.InvocationInfo.PositionMessage); 
         builder.AppendLine(string.Format("+ CategoryInfo: {0}", r.CategoryInfo)); 
         builder.AppendLine(string.Format("+ FullyQualifiedErrorId: {0}", r.FullyQualifiedErrorId)); 
        } 
       } 
      } 
      throw new Exception(builder.ToString()); 
     } 
    return result; 
}