我正在开发一个ASP.NET MVC Web应用程序,我有以下代码,这些代码定义了一个遍历服务器列表的循环,并在我的ASP.NET MVC中为每个服务器执行PowerCli命令:
//Start Loop
var shell = PowerShell.Create();
var shell2 = PowerShell.Create();
var shell3 = PowerShell.Create();
string PsCmd = "add-pssnapin VMware.VimAutomation.Core; $vCenterServer = '" + vCenterName + "';$vCenterAdmin = '" + vCenterUsername + "' ;$vCenterPassword = '" + vCenterPassword + "';" + System.Environment.NewLine;
PsCmd = PsCmd + "$VIServer = Connect-VIServer -Server $vCenterServer -User $vCenterAdmin -Password $vCenterPassword;" + System.Environment.NewLine;
PsCmd = PsCmd + "Get-VMHost " + System.Environment.NewLine;
string PsCmd2 = "add-pssnapin VMware.VimAutomation.Core; $vCenterServer = '" + vCenterName + "';$vCenterAdmin = '" + vCenterUsername + "' ;$vCenterPassword = '" + vCenterPassword + "';" + System.Environment.NewLine;
PsCmd2 = PsCmd2 + "$VIServer = Connect-VIServer -Server $vCenterServer -User $vCenterAdmin -Password $vCenterPassword;" + System.Environment.NewLine;
PsCmd2 = PsCmd2 + " Get-VMHost " + vCenterName + "| Get-VMHostNetworkAdapter -VMKernel" + System.Environment.NewLine;
shell.Commands.AddScript(PsCmd);
shell2.Commands.AddScript(PsCmd2);
dynamic results = shell.Invoke();
dynamic results2 = shell2.Invoke();
// end of loop
但我已经注意到,有时外壳命令会挂起,执行永远不会结束,所以我可以定义一个超时行为,以便在5分钟后跳过命令,如果没有返回结果...
3条答案
按热度按时间uplii1fm1#
您将不得不使用您自己的超时命令。下面是我基于MSDN Blog entry by Keith Babinec - Executing PowerShell scripts from C#编写的代码。我在控制台应用程序中编写的示例仅用于演示目的。我发现更容易看到正在发生的事情。您可以通过删除控制台输出和其他调整将其转换为ASP.NET应用程序。
以下是Program.cs
这里是PowerShellHelper.cs
sbdsn5lh2#
我更喜欢这个简短的结构:
7qhs6swi3#
PowerShell超时调用
有一个短得多(因此不容易出错)的解决方案: