0

如果我尝试Powershell通过 c# 运行命令,则会收到以下错误:“术语 'select' 未被识别为cmdlet函数、脚本文件或可运行程序的名称。请检查名称的拼写,或者如果路径已包含,请验证路径是否正确,然后重试。”

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

我尝试运行的命令看起来像 ig:“Get-Mailbox -Organization 'CoolOrganizationNameGoesHere'| select ServerName

“管道”|似乎有问题,我在主要搜索引擎上用最狂野的关键字组合搜索浪费了几个小时,但我没有发现任何有用的东西。

我尝试的最后一件事是设置PSLanguageModepublished IIS-Applicationfor的属性Powershell,结果还是和之前写的一样。

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

谁能告诉我哪里出了问题,就像大海捞针一样!

谢谢!

4

1 回答 1

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;
}
于 2011-11-03T08:57:57.307 回答