web-dev-qa-db-ja.com

コマンドプロンプトからブール値をPowerShellスクリプトに渡す方法

バッチファイルから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にブール引数を渡すことができますか?

85
mutelogan

-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
50
Emperor XLII

より明確な使用法は、代わりにスイッチパラメータを使用することです。次に、Unifyパラメーターが存在するということは、それが設定されたことを意味します。

そのようです:

param (
  [int] $Turn,
  [switch] $Unify
)
157
David Mohundro

パラメーターのタイプを[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
11
Filburt

これは古い質問ですが、実際にはPowerShellドキュメントにこれに対する答えがあります。私は同じ問題を抱えていましたが、RTFMが実際にそれを解決しました。ほぼ。

https://docs.Microsoft.com/en-us/powershell/module/Microsoft.powershell.core/about/about_powershell_exe

-Fileパラメーターのドキュメントには、「まれに、スイッチパラメーターにブール値を指定する必要がある場合があります。Fileパラメーターの値でスイッチパラメーターにブール値を指定するには、パラメーター名と値を次のような中括弧:-File。\ Get-Script.ps1 {-All:$ False} "

次のように書かなければなりませんでした。

PowerShell.Exe -File MyFile.ps1 {-SomeBoolParameter:False}

そのため、PowerShell 4.0では、true/falseステートメントの前に「$」はありませんでした。

6
LarsWA

私は、パラメータとしてブール値を使用/設定する最良の方法は、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からの引数では、ブール値を単純な文字列として渡すことができます:)。

5
Drasius