无法集成PowerShell和c#

时间:2010-08-14 06:51:31

标签: c# powershell

编辑:我想出了如何解决我问题的特定代码(请参阅我的回答),但我仍然在寻找有关集成PowerShell和C#的资源​​,所以请随时发表评论或回答!< / p>

我发现a simple example让你的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线程访问某些gui东西?)?似乎类似的功能与WindowsForms一起用于示例代码的海报。

此外,除了我链接到and this one here的示例之外,我还没有找到很多关于链接c#和powershell的资源。最终我正在尝试创建一个可以通过PowerShell编写脚本的应用程序 - 有没有人知道其他好的在线资源或一本涵盖这个的好书?

感谢!!!!

2 个答案:

答案 0 :(得分:2)

我明白了! (在this video的帮助下)。上面的代码需要这一行才能工作

runspace.ThreadOptions = PSThreadOptions.UseCurrentThread

这对我来说很有意义,我总是遇到STA线程和jaz所有问题:)。

答案 1 :(得分:1)

不应该是 .Text 而不是 .Title

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