如何将 [switch] 参数从 C# 传递给 PowerShell 脚本

本文关键字:脚本 PowerShell 参数 switch | 更新日期: 2023-09-27 18:32:11

我有一个名为testSwitch.ps1的powershell脚本:

param(
    [switch] $s
)
Return 's= ' + $s 

当我像这样直接在PowerShell中调用此脚本时:

.'testSwitch.ps1 -s

输出为

s= True

当开关丢失时,它会输出 False。 但是当我尝试使用此 C# 代码调用相同的脚本时:

Command command = new Command(@"testSwitch.ps1");
command.Parameters.Add(new CommandParameter("s"));
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
using (Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration))
{
    runspace.Open();
    Pipeline pipeline = runspace.CreatePipeline();
    pipeline.Commands.Add(command);
    IEnumerable<PSObject> psresults = new List<PSObject>();
    psresults = pipeline.Invoke();
    Console.WriteLine(psresults.ToArray()[0].ToString());
}

输出为:

s= False

似乎 CommandParameter 总是将开关参数解释为 false,这与 PowerShell 命令行解释器不同。 令人沮丧的是,这会导致脚本看到 [switch] 参数的值为 false,而不会引发任何关于未指定值的异常。 与 [bool] 参数相反,如果未在 CommandParameter 构造函数中提供值,则会引发异常。

如何将 [switch] 参数从 C# 传递给 PowerShell 脚本

奇怪的是,您必须指定 true 作为参数值,如下所示:

command.Parameters.Add(new CommandParameter("s", true));

此外,指定 false 也可以按预期工作:

command.Parameters.Add(new CommandParameter("s", false));

返回

s= False

所以,我想从 C# 调用时,[开关] 参数应该完全像 [bool] 参数一样对待!