Возникли проблемы при интеграции PowerShell и C # - PullRequest
1 голос
/ 14 августа 2010

РЕДАКТИРОВАТЬ: я выяснил, как решить конкретную часть кода, поврежденную частью моего вопроса (см. Мой ответ ниже), но я все еще ищу ресурсы по интеграции powershell и C #, поэтому, пожалуйста, не стесняйтесь комментировать или отвечать! 1001 *

Я нашел простой пример того, как сделать ваши объекты C # видимыми для сценариев powershell, и я поиграл с этим.

Используя следующий код:

  public partial class MainWindow : Window
        {
            public string MyName = "Evan";

            public MainWindow()
            {
                InitializeComponent();
                MessageBox.Show(RunScript("$DemoForm | Get-Member"));
                MessageBox.Show(RunScript("$DemoForm.MyName"));
                MessageBox.Show(RunScript("$DemoForm.Title"));
            }

            private string RunScript(string scriptText)
            {
                // create Powershell runspace

                Runspace runspace = RunspaceFactory.CreateRunspace();

                // open it

                runspace.Open();
                runspace.SessionStateProxy.SetVariable("DemoForm", this);
                // create a pipeline and feed it the script text

                Pipeline pipeline = runspace.CreatePipeline();
                pipeline.Commands.AddScript(scriptText);

                // add an extra command to transform the script
                // output objects into nicely formatted strings

                // remove this line to get the actual objects
                // that the script returns. For example, the script

                // "Get-Process" returns a collection
                // of System.Diagnostics.Process instances.

                pipeline.Commands.Add("Out-String");

                // execute the script

                Collection<PSObject> results = pipeline.Invoke();

                // close the runspace

                runspace.Close();

                // convert the script result into a single string

                StringBuilder stringBuilder = new StringBuilder();
                foreach (PSObject obj in results)
                {
                    stringBuilder.AppendLine(obj.ToString());
                }

                return stringBuilder.ToString();
            }


}

Я получаю ожидаемые результаты от этих двух строк:

MessageBox.Show(RunScript("$DemoForm | Get-Member"));
MessageBox.Show(RunScript("$DemoForm.Evan"));

Но эта строка не работает (без ошибок, просто возвращает пустую строку):

MessageBox.Show(RunScript("$DemoForm.Title"));

Есть идеи, почему первые два работают, а не третьи? Имеет ли это какое-то отношение к многопоточности (необходимость доступа к определенным графическим объектам из sta-потока?)? Похоже, что аналогичные функции работали с WindowsForms для постера примера кода.

Кроме того, кроме того примера, который я связал с , и вот здесь Мне не удалось найти много ресурсов в Интернете о связях c # и powershell. В конечном итоге я пытаюсь создать приложение, которое можно будет создавать с помощью сценариев PowerShell. Кто-нибудь знает о других хороших онлайн-ресурсах или хорошей книге, посвященной этой теме?

Спасибо !!!!

Ответы [ 2 ]

2 голосов
/ 14 августа 2010

Я понял! (с помощью этого видео ). Приведенный выше код нуждается в этой строке для работы

runspace.ThreadOptions = PSThreadOptions.UseCurrentThread

Что имеет для меня смысл, у меня всегда были проблемы с потоками STA и всем этим jaz:).

1 голос
/ 14 августа 2010

Разве это не должно быть .Text вместо .Title ?

MessageBox.Show(RunScript("$DemoForm.Text"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...