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


103

バッチファイルから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に渡すにはどうすればよいですか?

回答:


57

-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

ダビデは示唆して、スイッチの引数を使用した場合も、明示的にブール値を渡す必要性を除去することで、コールを簡素化し、より多くの慣用のようになります。

CMD> powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify
Turn: 1
Unify: True

6
「私」のように、「-File」パラメータを保持する必要があり、スイッチ引数に変更できないが、送信される文字列値を制御できる場合、最も簡単な解決策は、パラメータを[System.Convert] :: ToBoolean($ Unify);を使用したブール値。その場合、文字列値は「True」または「False」である必要があります。
クリスヘインズ

187

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

そのようです:

param (
  [int] $Turn,
  [switch] $Unify
)

21
これは受け入れられる答えになるはずです。議論を促進するために、あなたはそうのような他のパラメータと同様にデフォルト値を設定することができます[switch] $Unify = $false
マリオTacke

ブールが進むべき道であると確信していたので、私はこの答えを見過ごしました。そうではない。スイッチはブール値の機能をカプセル化し、次の種類のエラーを停止します:「値 "False"をタイプ "System.Management.Automation.ParameterAttribute"に変換できません。スイッチは私のために機能しました。」
TinyRacoon

2
@MarioTackeスクリプトの呼び出し時にスイッチパラメータを指定しない場合、自動的にに設定され$falseます。したがって、デフォルト値を明示的に設定する必要はありません。
doubleDown 2018年

この提案は非常にうまくいきました。パラメータの1つを[bool]から[switch]に更新できました。これにより、タスクスケジューラ経由で引数を渡すことができました。
JustaDaKaje 2018

12

これは古い質問ですが、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}

つまり、true / falseステートメントの前に '$'はなく、PowerShell 4.0ではそれでうまくいきました


1
共有していただきありがとうございます!私の問題を完全に解決しました。
ジュリアシュワルツ

1
回答のリンクは、内容が変更されているようです。しかし、ここで
Slogmeister Extraordinaire

現在のドキュメントのリンクabout_powershell.exeまたは、単にrungpowershell -h
Seth

この厄介な回避策が機能したことには驚いています-Windows PowerShell v5.1では機能しません(先行機能の有無にかかわらず$)。また、PowerShell Coreでは不要になったことにも注意してください。ドキュメントの修正を依頼しました。github.com/MicrosoftDocs/PowerShell-Docs/issues/4964を
mklement0

11

パラメータのタイプを次のように設定してみてください[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

1
XLII皇帝の回答と-Fileパラメーターに関するコメントは、元の質問のすべての側面をカバーする必要があります。誰かがデフォルト値を提供することについての私のヒントも役立つかもしれないので、私は私の答えを残します。
フィルバート2013

よくやったフィルバート。あなたの答えは私が私のスクリプトをチェックすることを引き起こしました、それはすでにデフォルトが必須の値$ falseとして指定されています(私は数年前に書いて、それについてすべて忘れていました)-したがって、問題のあるブールパラメータを指定する必要さえありませんコマンドライン。すばらしい:)
Zeek2

5

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


2

PowerShellでは、ブール型パラメーターは、変数の前に型を示すことで宣言できます。

    function GetWeb() {
             param([bool] $includeTags)
    ........
    ........
    }

$ trueを渡すことで値を割り当てることができます| $ false

    GetWeb -includeTags $true

名前付きの入力引数を明示的に渡すだけで、それがうまくいきました。ありがとうAhmed
スティーブテイラー

0

Windows PowerShell v5.1 / PowerShell Core 7.0.0-preview.4の時点での既存の回答要約して補足するに

David Mohundroの回答は、[bool]パラメーターの代わりにPowerShell[switch]パラメーターを使用する必要があることを正しく指摘しています。スイッチ名の指定の有無-Unify指定されている指定されていないか)はその値を意味するため、元の問題は解消されます。


ただし、特にプログラムでコマンドラインを構築している場合は、スイッチ値を明示的に渡す必要がある場合があります


PowerShell Coreでは、元の問題Emperor XLIIの回答で説明)修正れました

つまり、名前の付い$true[switch]パラメーターに明示的に渡すには、次のように-Unify記述します。

pwsh -File .\RunScript.ps1 -Unify:$true  # !! ":" separates name and value, no space

次の値を使用することができます:$falsefalse$truetrue、しかし渡すことに注意してください0またはする1ではない仕事。

スイッチ名と値がどのように区切られているか、2つの間に空白:があってはならないことに注意してください。

注:の[bool]代わりにパラメーターを宣言する場合[switch](通常は必要ありません)、同じ構文を使用する必要があります。動作する-Unify $false はずです、現在は動作しません。このGitHubの問題をご覧ください。


Windows PowerShell元の問題を持続する Windows PowerShellは、もはや積極的に開発されていないことを考える- - 、および固定を取得することはほとんどありません。

  • LarsWAの回答で提案されている回避策は、この執筆時点での公式ヘルプトピックに基づいていますが、v5.1では機能しません。

    • このGitHubの問題は、ドキュメントの修正を要求し、回避策の非有効性を示すテストコマンドも提供します。
  • -Command代わりに使用することが-File唯一の効果的な回避策です:

:: # From cmd.exe
powershell -Command "& .\RunScript.ps1 -Unify:$true" 

では-Command、あなたは効果的に渡しているPowerShellのコードの一部その後、いつものように評価され、 -とPowerShellの内側に渡す$true$false作品(しかしない truefalse、今もして受け入れられて-File)。

警告

  • を使用-Commandすると、$char が含まれている場合など、引数がさらに解釈される可能性があります。(で-File、引数はリテラルです)。

  • を使用-Commandすると、異なる終了コードが発生する可能性があります

詳細については、この回答この回答を参照してください。


0

invoke-commandを使用してスクリプトを関数に渡すときも、同様のことがありました。コマンドは文字列リテラルになるため、二重引用符ではなく単一引用符でコマンドを実行しました。'Set-Mailbox $sourceUser -LitigationHoldEnabled $false -ElcProcessingDisabled $true';


0

LinuxでbashからPowerShellスクリプトを実行すると、同じ問題が発生します。LarsWAの答えとほぼ同じように解決しました:

ワーキング:

pwsh -f ./test.ps1 -bool:true

機能していない:

pwsh -f ./test.ps1 -bool=1
pwsh -f ./test.ps1 -bool=true
pwsh -f ./test.ps1 -bool true
pwsh -f ./test.ps1 {-bool=true}
pwsh -f ./test.ps1 -bool=$true
pwsh -f ./test.ps1 -bool=\$true
pwsh -f ./test.ps1 -bool 1
pwsh -f ./test.ps1 -bool:1

-3

0for Falseまたは1forを使用することもできますTrue。それは実際にエラーメッセージでそれを示唆しています:

パラメータ 'Unify'の引数変換を処理できません。値を変換できません"System.String"型に"System.Boolean"使用、このタイプのパラメータのみをブール値または数値を受け入れ、$true$false代わりに1または0。

詳しくは、ブール値と演算子に関するこのMSDNの記事をご覧ください。


10
それは機能しません。整数値1または0が必要ですが、それを渡すと-File文字列として解釈されるため、同じエラーで失敗します。
Erti-Chris Eelmaa

提案が機能しないため、この答えは間違っています
mjs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.