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