我发现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编写脚本的应用程序 - 有没有人知道其他好的在线资源或一本涵盖这个的好书?
感谢!!!!
答案 0 :(得分:2)
我明白了! (在this video的帮助下)。上面的代码需要这一行才能工作
runspace.ThreadOptions = PSThreadOptions.UseCurrentThread
这对我来说很有意义,我总是遇到STA线程和jaz所有问题:)。
答案 1 :(得分:1)
不应该是 .Text 而不是 .Title ?
MessageBox.Show(RunScript("$DemoForm.Text"));