将参数从c#app传递到原始PowerShell脚本

时间:2011-12-16 13:00:34

标签: c# powershell

我在从c#应用程序将参数/参数传递到我的powershell脚本时遇到问题。问题是我有一个存储在我的数据库中的powershell脚本要执行。这个脚本接受参数及其在传入的参数中似乎没有的参数。我正在做的一个例子如下。 tasjRun.Task.Script是实际脚本而不是ps1文件的路径,我认为这可能是问题所在?我可以将参数传递给原始脚本吗?

非常感谢

理查德

var runspaceConfiguration = RunspaceConfiguration.Create();

var runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open ();

var pipeline = runspace.CreatePipeline();

var myCommand = new Command(taskRun.Task.Script, true);

foreach (var kvp in taskRun.GetScriptParameters())
{
    myCommand.Parameters.Add(new CommandParameter(kvp.Key, kvp.Value));
}

pipeline.Commands.Add(myCommand);

var result = pipeline.Invoke().FirstOrDefault();

2 个答案:

答案 0 :(得分:4)

我可以告诉你,你的方法原则上是有效的,例如:

var runspaceConfiguration = RunspaceConfiguration.Create();
var runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();

var pipeline = runspace.CreatePipeline();

var script = "param($p1,$p2) \"p1 is $p1, p2 is $p2\"";
var myCommand = new Command(script, true);

myCommand.Parameters.Add(new CommandParameter("p1", DateTime.Now));
myCommand.Parameters.Add(new CommandParameter("p2", Math.PI));

pipeline.Commands.Add(myCommand);

var result = pipeline.Invoke().FirstOrDefault();
Console.WriteLine(result);

输出:

p1 is 12/16/2011 10:24:48, p2 is 3.14159265358979

因此,我们需要查看您的脚本,以便更好地确定为什么这对您不起作用。

答案 1 :(得分:1)

我是stackoverflow的新手,所以请原谅任何奇怪的格式。我知道这个帖子已经老了,但我今天自己遇到了这个问题,并且无法在网上找到明确的解决方案,所以我想我会分享一个同事和我的解决方案。

诀窍是如果你正在调用一个实际的脚本(例如“C:\ scripts \ sendEmail.ps1”),那么你需要传递参数,就像从命令行运行脚本一样。在下面的代码中,说personName =“Joe”和personsEmail =“Joe@yahoo.com”。我假设taskRun.Task.Script是PS脚本的完整路径。

如果你打印myCommand,它应该是“C:\ scripts \ sendEmail.ps1 -Name Joe -Email Joe@yahoo.com”,其中-Name和-Email对应于sendEmail.ps1中的$ Name和$ Email参数(确保在PS脚本中正确设置参数!)

myCommand.Parameters.Add()在这种情况下不起作用,因为它假定您的命令是实际命令,而不是完整脚本。 myCommand.Parameters.Add()适用于这种情况:如果你写了var myCommand = new Command(“gwmi Win32_Bios”);然后把myCommand.Parameters.Add(“computerName”,“myComputer”);和myCommand.Parameters.Add(“凭证”,“myPassword”);其中“myComputer”和“myPassword”是硬编码的字符串,你会得到命令“gwmi win32_Bios -computerName myComputer -credential myPassword”哪个应该执行正常(它不会像我写的那样返回数据,但它将正确传递参数。)

对不起,这太长了,但我希望它能说清楚,因为我在这个问题上挣扎了很长时间。完整代码如下。仅供参考,您不需要runspaceConfiguration来创建Runspace对象。

var runspaceConfiguration = RunspaceConfiguration.Create();

var runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);

var pipeline = runspace.CreatePipeline();    

var myCommand = new Command(String.Format("{0} -Name {1} -Email {2}", taskRun.Task.Script, personsName, personsEmail), true);

pipeline.Commands.Add(myCommand);

var result = pipeline.Invoke().FirstOrDefault(); 
相关问题