在c#中使用文字和代码块与powershell 2.0交互的问题

本文关键字:powershell 交互 问题 代码 文字 | 更新日期: 2023-09-27 18:09:52

如果我尝试通过c#运行Powershell命令,我会得到以下错误:术语"select"不能被识别为cmdlet、函数、脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后再试一次。"

如果命令是直接执行与Powershell(.exe)所有工作正常!

我尝试运行的命令看起来像i.g:"Get-Mailbox -Organization 'CoolOrganizationNameGoesHere' | select ServerName "

似乎"管道"有问题,我浪费了很多时间在各大搜索引擎上搜索最疯狂的关键词组合,但我没有发现任何有用的

我尝试的最后一件事是为Powershell设置已发布的IIS-ApplicationPSLanguageMode属性,结果仍然与之前写的相同。

可能WinRM配置错误?或者我的本地Powershell配置已损坏?是否有关于c#(或任何其他。net语言)使用Powershell远程访问的良好编写文档并使用Pipe |"命令"?

谁能告诉我怎么了,这就像大海捞针一样!

谢谢!

在c#中使用文字和代码块与powershell 2.0交互的问题

技巧可能在于您创建命令的方式。如果脚本作为字符串运行,应该使用:

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;
}