我正在尝试从VB.Net中运行一些PowerShell代码(如果你知道,C#编码器也可以提供帮助!).
代码的第一部分,我需要用密码连接到一个控制器,我需要保持连接打开.我只需点击一下按钮就可以运行其他命令(获取文件,显示文件,删除特定文件).
如何保持运行空间打开并分别运行每行代码?我需要使用"CreateRunspacePool"吗?如果是这样,我该如何使用它?
编辑: 我现在正在玩RunspaceStateInfo.State,但我不知道如何保持连接打开.我已经尝试过将Page_Load和Page_Init事件打开一次,但是在某个地方,它会关闭.我确实删除了".Close"命令
你还没有提供很多信息,但是你在谈论Page_Load和Page_Init我假设你试图从ASP.NET Web应用程序中执行此操作.通过按下按钮并在Runspace上设置状态.
如果这是一个winforms应用程序,您只需创建一个运行空间:
Runspace runspace = RunspaceFactory.CreateRunspace(Host);
Run Code Online (Sandbox Code Playgroud)
然后创建powershell实例并只重用此运行空间:
var ps1 = PowerShell.Create();
ps1.Runspace = runspace;
ps1.AddScript("Write-Host 'hello'")
var ps2 = PowerShell.Create();
ps2.Runspace = runspace;
ps2.AddScript("Write-Host 'world'")
Run Code Online (Sandbox Code Playgroud)
您可以保留运行空间,只需在按钮单击与同一个运行空间之间运行脚本.
如果你在asp.net但是这是不同的,显然每次你点击一个按钮产生一个新的线程,你将无法将运行空间保存在变量中,所以你需要做一些事情,如保持它会议如下:
protected PSHost Host
{
get
{
if (this.Session["Host"] == null)
{
var host = new MyHost();
this.Session["Host"] = host;
}
return (PSHost)this.Session["Host"];
}
}
protected Runspace Runspace
{
get
{
if (this.Session["Runspace"] == null)
{
var rs = RunspaceFactory.CreateRunspace(Host);
this.Session["Runspace"] = rs;
rs.Open();
}
return (Runspace)this.Session["Runspace"];
}
}
Run Code Online (Sandbox Code Playgroud)
然后我测试了它的工作原理:
protected void Page_Load(object sender, EventArgs e)
{
Button1.Click += new EventHandler(Button1_Click);
Button2.Click += new EventHandler(Button2_Click);
Button3.Click += new EventHandler(Button3_Click);
}
void Button3_Click(object sender, EventArgs e)
{
var ps = PowerShell.Create();
ps.Runspace = this.Runspace;
ps.AddScript("$test | ft | out-string");
var input = new List<object>();
var output = new List<object>();
ps.Invoke(input, output);
TextBox1.Text = output.First().ToString();
}
void Button2_Click(object sender, EventArgs e)
{
var ps = PowerShell.Create();
ps.Runspace = this.Runspace;
ps.AddScript("$test = 'world'");
ps.Invoke();
}
void Button1_Click(object sender, EventArgs e)
{
var ps = PowerShell.Create();
ps.Runspace = this.Runspace;
ps.AddScript("$test = 'hello'");
ps.Invoke();
}
Run Code Online (Sandbox Code Playgroud)
当我单击按钮1然后单击3时,它显示"Hello"和
当我点击按钮2然后按3时它显示"世界"
所以它成功地重用了运行空间.
| 归档时间: |
|
| 查看次数: |
4210 次 |
| 最近记录: |