Проблемы с использованием литералов и кодовых блоков с c # для взаимодействия с powershell 2.0 - PullRequest
0 голосов
/ 27 сентября 2011

Если я пытаюсь выполнить команду Powershell через c #, я получаю следующую ошибку: «Термин« выбрать »не распознается как имя cmdlet, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, если путь был указан, убедитесь, что путь правильный, и повторите попытку. . "

Если команда была выполнена напрямую с Powershell(.exe), все работает нормально!

Команда, которую я пытаюсь запустить, выглядит следующим образом: «Get-Mailbox -Organization 'CoolOrganizationNameGoesHere' | select ServerName»

Похоже, что есть проблема с "Трубой" |, Я потратил часы на поиск в основных поисковых системах с самыми дикими комбинациями ключевых слов, но я не нашел ничего, что работает.

Последнее, что я попробовал, это установление свойства PSLanguageMode опубликованного IIS-Application для Powershell. Результат остается таким же, как и ранее.

Может быть, WinRM неправильно настроен? Или моя локальная Powershell конфигурация повреждена? Есть ли хорошо написанная документация по C # (или любому другому языку .Net) с использованием Powershell с удаленным доступом? и с помощью трубы | "Команда"?

Может кто-нибудь сказать мне, что не так, это все равно, что найти иголку в стоге сена!

Спасибо!

1 Ответ

2 голосов
/ 03 ноября 2011

Трюк может быть в том, как вы создаете свою команду. Если вы запускаете скрипт как строку, вы должны использовать:

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