从C#调用PS脚本(带参数)时出现问题

时间:2017-04-11 14:56:52

标签: c# powershell

我正在尝试设置一个简单的.aspx网页,它将接受用户输入的字符串(稍后,多个字符串)并使用该字符串作为Powershell脚本的参数值。

PS脚本现在看起来像这样:

[CmdletBinding()]
param (
    [string] $ServiceName
)

$ServiceName | out-file c:\it\test.txt 
$ServiceName | Out-String

C#代码如下所示:

var shell = PowerShell.Create();

// Add the script to the PowerShell object
shell.Commands.AddScript("C:\\it\\test.ps1 -ServiceName BITS");

// Execute the script
var results = shell.Invoke();

当我跑步时,我得到" BITS"写入test.txt文件。我现在需要做的是设置应用程序来调用脚本,传入" ServiceName"参数。我找到了这个:Call PowerShell script file with parameters in C#并尝试了以下代码:

PowerShell ps = PowerShell.Create();
ps.AddScript(@"c:\it\test.ps1").AddParameter("ServiceName", "BITS");
var results = ps.Invoke();

在这种情况下,调用脚本并创建test.txt文件,但未将值(BITS)写入文件。我在这里错过了什么?为什么不将参数传递给脚本?

感谢。

2 个答案:

答案 0 :(得分:0)

我最终使用

var ps = @"C:\it\test.ps1";
processInfo = new ProcessStartInfo("powershell.exe", "-File " + ps + " -ServiceName BITS);

我不喜欢这样,但它确实有效。 耸肩

答案 1 :(得分:0)

以下是包括我在内的未来读者的三种可能的解决方案:

using (PowerShell ps = PowerShell.Create())
{
   //Solution #1
   //ps.AddCommand(@"C:\it\test.ps1", true).AddParameter("ServiceName", "BITS");
   //Solution #2
   //ps.AddScript(@"C:\it\test.ps1 -ServiceName 'BITS'", true);
   //Solution #3
   ps.AddScript(File.ReadAllText(@"C:\it\test.ps1"), true).AddParameter("ServiceName", "BITS");

   Collection<PSObject> results = ps.Invoke();
} 

虽然我从https://blogs.msdn.microsoft.com/kebab/2014/04/28/executing-powershell-scripts-from-c/那里得到了这个主意,但我在其他任何地方都没有看到解决方案#3的文档。