如何将 [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
构造函数中提供值,则会引发异常。
奇怪的是,您必须指定 true 作为参数值,如下所示:
command.Parameters.Add(new CommandParameter("s", true));
此外,指定 false 也可以按预期工作:
command.Parameters.Add(new CommandParameter("s", false));
返回
s= False
所以,我想从 C# 调用时,[开关] 参数应该完全像 [bool] 参数一样对待!