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执行的结果?郁闷中,求帮助?
结果一样,应当是你的脚本决定的。比如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 类。
这样是没有问题: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
没编辑好,弄乱了。
你可以在原有的问题中编辑追加,直接在评论框中回复,看的不是很清楚。或着,在回答这个问题中把代码贴上去,谢谢!