通常、スイッチ パラメーターの指定を何らかの変数に任せたい場合は、WhatIf パラメーターで見られるように、スイッチ パラメーターに式を渡すことができます。
test.ps1
param ( [string] $source, [string] $dest, [switch] $test )
Copy-Item -Path $source -Destination $dest -WhatIf:$test
これにより、スイッチを操作する際の柔軟性が大幅に向上します。ただし、cmd.exe などで powershell を呼び出すと、次のような結果になります。
D:\test>powershell -file test.ps1 -source test.ps1 -dest test.copy.ps1 -test:$true
D:\test\test.ps1 : Cannot process argument transformation on
parameter 'test'. Cannot convert value "System.String" to type "System.Manageme
nt.Automation.SwitchParameter", parameters of this type only accept booleans or
numbers, use $true, $false, 1 or 0 instead.
At line:0 char:1
+ <<<<
+ CategoryInfo : InvalidData: (:) [test.ps1], ParentContainsError
RecordException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,test.ps1
ただし、 、 、 を渡すと同じ結果が表示され-test:true
ます-test:1
。なぜこれが機能しないのですか?Powershell の型変換システムは、これらの文字列を bool または switch に変換できるものとして自動的に認識し、変換するべきではありませんか?
これは、他のシステム (ビルド システムなど) から PowerShell スクリプトを呼び出すときに、複雑なフロー制御構造を構築して、コマンド文字列にスイッチを含めるか省略するかを決定する必要があるということですか? これは退屈でエラーが発生しやすいように思われるため、そうではないと思います。