バッチファイルからPowerShellスクリプトを呼び出す必要があります。スクリプトの引数の1つはブール値です。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify $false
コマンドは次のエラーで失敗します。
Cannot process argument transformation on parameter 'Unify'. Cannot convert value "System.String" to type "System.Boolean", parameters of this type only accept booleans or numbers, use $true, $false, 1 or 0 instead.
At line:0 char:1
+ <<<< <br/>
+ CategoryInfo : InvalidData: (:) [RunScript.ps1], ParentContainsErrorRecordException <br/>
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,RunScript.ps1
今のところ、スクリプト内で文字列からブールへの変換を使用しています。しかし、どのようにしてPowerShellにブール引数を渡すことができますか?
-File
パラメーターが使用されている場合、powershell.exeはスクリプト引数を完全には評価しないようです。特に、以下の例と同様に、$false
引数は文字列値として扱われています。
PS> function f( [bool]$b ) { $b }; f -b '$false'
f : Cannot process argument transformation on parameter 'b'. Cannot convert value
"System.String" to type "System.Boolean", parameters of this type only accept
booleans or numbers, use $true, $false, 1 or 0 instead.
At line:1 char:36
+ function f( [bool]$b ) { $b }; f -b <<<< '$false'
+ CategoryInfo : InvalidData: (:) [f], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,f
-File
を使用する代わりに、-Command
を試すことができます。これは、呼び出しをスクリプトとして評価します。
CMD> powershell.exe -NoProfile -Command .\RunScript.ps1 -Turn 1 -Unify $false
Turn: 1
Unify: False
David が示唆するように、スイッチ引数を使用することもより慣用的であり、ブール値を明示的に渡す必要をなくすことで呼び出しを簡素化します。
CMD> powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify
Turn: 1
Unify: True
より明確な使用法は、代わりにスイッチパラメータを使用することです。次に、Unifyパラメーターが存在するということは、それが設定されたことを意味します。
そのようです:
param (
[int] $Turn,
[switch] $Unify
)
パラメーターのタイプを[bool]
に設定してみてください。
param
(
[int]$Turn = 0
[bool]$Unity = $false
)
switch ($Unity)
{
$true { "That was true."; break }
default { "Whatever it was, it wasn't true."; break }
}
この例では、入力が提供されない場合、$Unity
が$false
にデフォルト設定されます。
使用法
.\RunScript.ps1 -Turn 1 -Unity $false
これは古い質問ですが、実際にはPowerShellドキュメントにこれに対する答えがあります。私は同じ問題を抱えていましたが、RTFMが実際にそれを解決しました。ほぼ。
-Fileパラメーターのドキュメントには、「まれに、スイッチパラメーターにブール値を指定する必要がある場合があります。Fileパラメーターの値でスイッチパラメーターにブール値を指定するには、パラメーター名と値を次のような中括弧:-File。\ Get-Script.ps1 {-All:$ False} "
次のように書かなければなりませんでした。
PowerShell.Exe -File MyFile.ps1 {-SomeBoolParameter:False}
そのため、PowerShell 4.0では、true/falseステートメントの前に「$」はありませんでした。
私は、パラメータとしてブール値を使用/設定する最良の方法は、PSスクリプトで次のように使用することだと思います:
Param(
[Parameter(Mandatory=$false)][ValidateSet("true", "false")][string]$deployApp="false"
)
$deployAppBool = $false
switch($deployPmCmParse.ToLower()) {
"true" { $deployAppBool = $true }
default { $deployAppBool = $false }
}
そのため、次のように使用できます。
.\myApp.ps1 -deployAppBool True
.\myApp.ps1 -deployAppBool TRUE
.\myApp.ps1 -deployAppBool true
.\myApp.ps1 -deployAppBool "true"
.\myApp.ps1 -deployAppBool false
#and etc...
したがって、cmdからの引数では、ブール値を単純な文字列として渡すことができます:)。