2011-02-28 36 views
2

我已经创建供内部使用,允许某些用户来启动和停止链接到有QA测试环境中虚拟机的asp.net web应用程序,网页背后的代码运行启动所选服务器一旦一个按钮是一个PowerShell脚本按在一个ASP.net页面上。在C#中运行powershell,没有多少运气!

我已经reserched从这个网站implimented代码的很多,但我来面对一些问题。

每次我点击主网页上的按钮从PowerShell脚本反馈的错误说“你不能叫一个空值表达式的方法。”唯一的问题是如果我从像这样的“。\ script \ test.ps1'W7EA9'”这样的PowerShell提示符运行它,它工作正常。

这是调用PowerShell脚本类。

public String Startserver(String Servername) 
    { 

     String scriptText =". \\scripts\\test.ps1 " + Servername + ""; 


     // create Powershell runspace 
     Runspace runspace = RunspaceFactory.CreateRunspace(); 
     // open it 
     runspace.Open(); 

     // create a pipeline and feed it the script text 
     Pipeline pipeline = runspace.CreatePipeline(); 
     pipeline.Commands.AddScript(scriptText); 


     // execute the script 
     Collection<PSObject> results = new Collection<PSObject>(); 

     try 
     { 
      results = pipeline.Invoke(); 
     } 
     catch (Exception ex) 
     { 
      results.Add(new PSObject((object)ex.Message)); 
     } 

     // 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(); 
     //return scriptText; 
    } 

,这里是它试图运行

Param ($server = $arg[0]) 

    $Core = get-wmiobject -namespace root\virtualization -class Msvm_Computersystem -filter "ElementName = '$server'" 
    $status = $Core.RequestStateChange(2) ` 

这可能是真正的财产以后明显的,但我只是没有看到它和任何帮助将是巨大的PowerShell脚本。

感谢

克里斯

+0

后面的代码将尝试在服务器中运行powershell命令。这是你想要的? – Shoban 2011-02-28 15:20:46

+0

您确定将正确的ServerName传递给该函数吗? – vissi 2011-02-28 15:25:52

+0

嗨,我希望运行该网站上的服务器上的脚本,我已调试我的机器上的应用程序和服务器名称传递到该字符串之前它传递给PowerShell – ChrisLupson 2011-02-28 15:44:12

回答

0

我没有看到你在任何地方提供参数的脚本。

+0

Hypervserver Start = new Hypervserver(); 字符串结果= Start.Startserver(“W7EA9”); Label1.Visible = true; Label1.Text = result; – ChrisLupson 2011-02-28 15:40:58

+0

我并不是指你如何将参数传递给C#代码,而是如何获得传递给powershell脚本的参数(在本例中为W7EA9)。你有一个参数语句($ server = $ arg [0]),但是我没有看到C#代码传入了参数。不过我可能会错过它。 – 2011-02-28 16:44:31

+0

嗨对不起,意味着发布这样的信息,将变量传递给powershell的脚本部分以“String scriptText =”开头。 \\ scripts \\ test.ps1“+ Servername +”“,然后通过代码pipeline.Commands.AddScript(scriptText);添加到管道;然后通过代码调用results = pipeline.Invoke(); – ChrisLupson 2011-02-28 17:03:35

0

我从一个按钮,按下经过paramater一个asp.net页面后面的代码看起来像这样

 Hypervserver Start = new Hypervserver(); 

     String result = Start.Startserver("W7EA9"); 

     Label1.Visible = true; 
     Label1.Text = result; 
3

这是一个最好的一步一步的指导,从ASP.NET运行PowerShell的。

http://devinfra-us.blogspot.com/2011/02/using-powershell-20-from-aspnet-part-1.html

HTH

+0

成功地使用System.Management.Automation来自己运行PowerShell脚本(尽管来自Windows服务) – 2011-02-28 16:18:59

+0

我已经查看了这个并做了一些调整,它看起来像PowerShell代码没有在服务器上正确运行,我可以运行一个获取进程| out-string并获取数据,但服务器重新启动将不会运行,但会直接从powershell运行 – ChrisLupson 2011-02-28 16:26:50

+0

与执行策略有关,只是猜测 – ravikanth 2011-02-28 16:36:27

0

下面是我怎么会做这个。

Runspace runspace = RunspaceFactory.CreateRunspace(); 
runspace.Open(); 
Pipeline pipeline = runspace.CreatePipeline(); 

Command myCommand = new Command("C:\\Scripts\\Test.ps1"); 
//I used full path name here, not sure if you have to or not 

CommandParameter myParam1 = new CommandParameter("-ServerName", "myServer"); 
myCommand.Parameters.Add(myParam1); 
//You can add as many parameters as you need to here 

pipeline.Commands.Add(myCommand); 

Collection<PSObject> results = pipeline.Invoke(); 
runspace.Close(); 

StringBuilder stringBuilder = new StringBuilder() 
foreach (PSObject obj in results) { 
    stringBuilder.AppendLine(obj.ToString()); 
} 
string thestring = stringBuilder.ToString(); 

一些注意事项。这不是一个注释或空行的脚本第一行应该是格式化这样的参数列表:

param([string]$ServerName,[string]$User) 

你有这样的,我只是想承认这样的事实,我不能得到这个工作时,我的脚本文件是一个带参数的函数。

对于某些命令,您可能需要额外的特权,在我的情况下,所有我的脚本工作这种方式,除了创造一个邮箱,我不得不添加凭据到连接。

格雷格

0

在PowerShell中,默认的参数集合称为的$ args,有一个 's';我非常肯定这就是为什么当你通过代码运行它时$ server是空的,因此Get-WmiObject调用返回null,当你尝试调用它的RequestStateChange方法时会导致错误。

我猜测它的工作原理在正常PowerShell窗口很好,因为你已经在会议上$服务器变量。