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 として解釈するようです。イライラするのは、これにより、値が[switch]
指定されていないことに関する例外をスローすることなく、スクリプトがパラメーターの値を false と見なすことです。[bool]
コンストラクターで値を指定しない場合に例外をスローするパラメーターとは対照的ですCommandParameter
。