将参数从c#应用程序传入原始powershell脚本

本文关键字:原始 powershell 脚本 应用程序 参数 | 更新日期: 2023-09-27 18:18:16

我有问题传递参数/参数到我的powershell脚本从c#应用程序。问题是,我有一个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();

将参数从c#应用程序传入原始powershell脚本

我可以告诉你,你的方法在原则上是有效的。

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

所以我们需要看看你的脚本,以便更好地确定为什么这对你不起作用

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

技巧是,如果你调用一个实际的脚本(例如:"C:'scripts'sendEmail.ps1"),那么您需要以与从命令行运行脚本相同的方式传递参数。在下面的代码中,假设personsName ="Joe",personsEmail ="Joe@yahoo.com"。我假设taskRun.Task.Script是PS脚本的完整路径。

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

myCommand.Parameters.Add()在这种情况下不起作用,因为它假设你的命令是一个实际的命令,而不是一个完整的脚本。myCommand. parameters . add()在这种情况下工作:如果你写var myCommand = new Command("gwmi Win32_Bios");然后输入myCommand.Parameters.Add("computerName","myComputer");和myCommand.Parameters。添加("凭据","我的密码");其中"myComputer"answers"myPassword"是硬编码字符串,你会得到命令,"gwmi win32_Bios -computerName myComputer -credential myPassword"应该执行良好(它不会像我写的那样返回数据,但它会正确地传递参数)。

对不起,这是这么长,但我想要清楚,因为我与这个问题斗争了相当长的一段时间。完整的代码如下。仅供参考,创建Runspace对象不需要Runspace configuration。

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();