2012-07-06 12 views
25

通常、スイッチパラメータの指定を一部の変数に遅延させたい場合は、WhatIfパラメータのようにswitchパラメータに式を渡すことができます。Powershell:コマンドラインでpowershellを起動するときに、パラメータを切り替えるために変数を渡すにはどうすればよいですか?

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スクリプトを呼び出すときに、コマンド文字列にスイッチを含めるかどうかを判断するために複雑なフロー制御構造を構築する必要があるか、これは退屈でエラーが起こりやすいので、そうでないと私は信じています。

答えて

9

スイッチのIsPresentプロパティを使用します。 例:それはテストに容易になるだろうので

function test-switch{ 
param([switch]$test) 
    function inner{ 
    param([switch]$inner_test) 
    write-host $inner_test 
    } 
    inner -inner_test:$test.IsPresent 
} 
test-switch -test:$true 
test-switch -test 
test-switch -test:$false 

True 
True 
False 

はところで、私は機能ではなく、スクリプトを使用していました。

+0

私は最初の例でみました何実際です:これが回避策ですそれは不透明な文字列として "$ true"を取ることを意味します。 – bwerks

+0

私はそのニュアンスを見逃しました。私は私の答えを更新します。 –

19

この現象は、connectにバグとして提出されています。問題は、スクリプトはcmd.exeのから呼び出されたときにPowerShellは式としてパラメータを評価していないということのようですが、むしろ -

powershell ./test.ps1 -source test.ps1 -dest test.copy.ps1 -test:$true 
関連する問題