PowerShell 类和Pipeline类区别是什么?为什么程序再次调用的时候得到的是第一次powershell执行的结果?郁闷中,求帮助?


PowerShell交流中心分类: QuestionsPowerShell 类和Pipeline类区别是什么?为什么程序再次调用的时候得到的是第一次powershell执行的结果?郁闷中,求帮助?
0
Code-X asked 9 年 ago

C#调用powershell,可以用PowerShell powershell = PowerShell.Create(),或者Pipeline pip = runspace.CreatePipeline();这两个有什么区别?
如下代码:
using (Runspace runspace = RunspaceFactory.CreateRunspace())
{
runspace.Open();
using (PowerShell powershell = PowerShell.Create())
{

powershell.Runspace = runspace;
powershell.AddScript(strPowerShellCmd);
var ShellResult = powershell.Invoke();
if (powershell.HadErrors)
{
log.WriteLogs(DateTime.Now.ToString() + “:TaskID-“+TaskId+”,脚本:” + strPowerShellCmd);
log.WriteLogs(DateTime.Now.ToString() + “:PowerShell执行错误。” + powershell.Streams.Error.ToString());
powershell.Commands.Clear();
return false;
}
else
{
if (TaskType == TaskTypeName.GetState)
{
foreach (var result in ShellResult)
{
Vm.VmState = result.Members[“State”].Value.ToString();
}
}
powershell.Commands.Clear();
return true;
}
}
}
为什么程序再次调用的时候得到的是第一次powershell执行的结果?郁闷中,求帮助?

2 Answers
1
Best Answer
Code-X answered 9 年 ago

谢谢,我找到原因了,是runspace造成的。

1
Mooser Lee 管理员 answered 9 年 ago

结果一样,应当是你的脚本决定的。比如1+1=2,你运行100次,结果应当都是一样的。
但是如果你运行这段脚本,结果一定不一样:

$ps= [PowerShell]::Create()
$ps.AddScript('get-date')
$ps.Invoke()
$ps.Dispose()

Pipeline 是powershell 1.0引入的。powershell 类是Windows PowerShell 2.0.引入的,支持的功能丰富,现在推荐使用powershell 类。

PaaP: 作为平台的Windows PowerShell(一)

PaaP: 作为平台的Windows PowerShell(二)

Code-X replied 9 年 ago

这样是没有问题:namespace PowerShellApp{ class Program { static void Main(string[] args) { InitialSessionState iss = InitialSessionState.CreateDefault(); while(true) { using (Runspace rs = RunspaceFactory.CreateRunspace()) { PowerShell ps = PowerShell.Create(); rs.Open(); ps.Runspace = rs; PSCommand cmd = new PSCommand(); cmd.AddCommand(“Get-Date”); //cmd.AddParameter(“Name”, “Debug”); ps.Commands = cmd; var res=ps.Invoke(); foreach (var result in res) { Console.WriteLine(result.Members[“TimeOfDay”].Value.ToString()); } ps.Dispose(); cmd.Clear(); rs.Close(); } } } }}但是如果用来更新Hyper-V中虚拟机的运行状态,就不行了:namespace PowerShellApp{ class Program { static void Main(string[] args) { InitialSessionState iss = InitialSessionState.CreateDefault(); while(true) { using (Runspace rs = RunspaceFactory.CreateRunspace()) { PowerShell ps = PowerShell.Create(); rs.Open(); ps.Runspace = rs; PSCommand cmd = new PSCommand(); cmd.AddCommand(“Get-VM”); cmd.AddParameter(“Name”, “Debug”); ps.Commands = cmd; var res=ps.Invoke(); foreach (var result in res) { Console.WriteLine(result.Members[“State”].Value.ToString()); } ps.Dispose(); cmd.Clear(); rs.Close(); } } } }}状态无论如何都不更新?但在powershell里手动执行就没有这个问题?这是什么问题。系统是Win8.1

Code-X replied 9 年 ago

没编辑好,弄乱了。

Mooser Lee 管理员 replied 9 年 ago

你可以在原有的问题中编辑追加,直接在评论框中回复,看的不是很清楚。或着,在回答这个问题中把代码贴上去,谢谢!