6

我有这个名为 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

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

4

1 回答 1

5

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

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

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

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

退货

s= False

所以,我猜 [switch] 参数在从 C# 调用时应该像 [bool] 参数一样对待!

于 2012-04-24T18:43:11.690 回答