Вызвать скрипт PowerShell из c # в пространстве выполнения и получить номер строки, где произошла ошибка - PullRequest
4 голосов
/ 13 апреля 2010

У меня есть несколько хостов PowerShell в C #, откуда я выполняю код скрипта PowerShell. Код ниже взят из хоста в Add0In для Visual Studio. Проблема заключается в том, что если в коде сценария PowerShell возникает ошибка, то я не знаю файла и номера строки файла сценария PowerShell, где произошла ошибка.

Мой код хостинга выглядит так:

        public Exception Execute(string scriptcode, Hashtable variables)
    {
        Runspace runspace = null;
        Pipeline pipeline = null;
        PipelineStateInfo info = null;

        try
        {
            // Make our output window active
            Logger.ShowOutputWindow();

            // Create the runspace and stuff.
            runspace = RunspaceFactory.CreateRunspace(host);
            pipeline = runspace.CreatePipeline();

            runspace.Open();

            // Add our scriptcode to the pipeline
            pipeline.Commands.Add(new Command(scriptcode, true));

            // We don't want to get PSObjects out of the pipeline, output result as string in default way
            pipeline.Commands.Add(new Command("Out-Default", true));

            // Set up global variables
            FillVariables(runspace, variables);

            SetUpOutputStreams(pipeline);


            // Run the scriptcode
            Collection<PSObject> psOutput = pipeline.Invoke();

            // Did it complete ok?
            info = pipeline.PipelineStateInfo;
            if (info.State != PipelineState.Completed)
            {
                return info.Reason;
            }
            else
            {
                return null; // succesful!
            }
        }
        catch (Exception ex)
        {
            return ex;
        }
    }

Сначала у меня был сценарий в переменной scriptcode, теперь я сначала записываю код во временный файл .ps1, чтобы я мог сообщить о количестве белья в этом файле. Но я не могу найти, как выполнить код в файле, поэтому можно получить имя файла и номера строк в случае ошибок.

Есть идеи?

1 Ответ

7 голосов
/ 20 апреля 2010

Это должно привести вас в нужное место:

//invoke pipeline
collection = pipeline.Invoke();

// check for errors (non-terminating)
if (pipeline.Error.Count > 0)
{
  //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));
      }
    }
  }
  return builder.ToString();
}

UPDATE:

Помимо информации, которую я написал в комментарии, просмотрите также эту книгу: Профессиональное программирование PowerShell

Эта книга показалась мне бесценной, когда я впервые начал программировать хост для среды выполнения PowerShell. Он был написан некоторыми разработчиками PowerShell.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...