web-dev-qa-db-ja.com

Powershell:コマンドラインでpowershellを呼び出すときに変数を渡してパラメーターを切り替えるにはどうすればよいですか?

通常、スイッチパラメーターの指定を特定の変数に遅らせたい場合は、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の型変換システムは、これらの文字列をブールまたはスイッチに変換可能であると自動的に認識して、変換するべきではありませんか?

これは、他のシステム(ビルドシステムなど)からPowerShellスクリプトを呼び出すときに、複雑なフロー制御構造を構築して、コマンド文字列にスイッチを含めるかどうかを決定する必要があることを意味しますか?これは退屈でエラーが発生しやすいようです。

30
bwerks

この動作は connect のバグとして報告されています。これは回避策です。

powershell ./test.ps1 -source test.ps1 -dest test.copy.ps1 -test:$true
24
jon Z

スイッチの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

ところで、スクリプトではなく関数を使用したので、テストが簡単になります。

13
Mike Shepard