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

4

1 に答える 1

5

不思議なことに、次のように、パラメータ値としてtrueを指定する必要があります。

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

さらに、falseを指定しても期待どおりに機能します。

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

戻り値

s= False

したがって、C#から呼び出す場合は、[switch]パラメーターを[bool]パラメーターとまったく同じように扱う必要があると思います。

于 2012-04-24T18:43:11.690 に答える