Как передать логические значения в сценарий PowerShell из командной строки - PullRequest
84 голосов
/ 22 февраля 2011

Мне нужно вызвать скрипт PowerShell из командного файла.Одним из аргументов сценария является логическое значение:

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?

Ответы [ 6 ]

153 голосов
/ 22 февраля 2011

Более понятным вариантом может быть использование параметров переключателя.Тогда само существование параметра Unify будет означать, что он установлен.

Примерно так:

param (
  [int] $Turn,
  [switch] $Unify
)
49 голосов
/ 05 сентября 2011

Похоже, что powershell.exe не полностью оценивает аргументы скрипта при использовании параметра -File.В частности, аргумент $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

Как предполагает Дэвид , использование аргумента switch также будет более идиоматичным, упрощая вызов, устраняя необходимость явной передачи логического значения:

CMD> powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify
Turn: 1
Unify: True
11 голосов
/ 22 февраля 2011

Попробуйте установить тип вашего параметра на [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
5 голосов
/ 26 июля 2016

Это более старый вопрос, но на самом деле ответ на него есть в документации по 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

4 голосов
/ 23 декабря 2016

Я думаю, лучший способ использовать / установить логическое значение в качестве параметра - использовать его в своем скрипте 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 вы можете передать логическое значение в виде простой строки:).

0 голосов
/ 22 июля 2014

Вы также можете использовать 0 для False или 1 для True. Это на самом деле предполагает, что в сообщении об ошибке:

Невозможно обработать преобразование аргумента для параметра 'Unify'. Невозможно преобразовать значение "System.String" в тип "System.Boolean", параметры этого типа принимают только логические значения или числа, вместо них используйте $true, $false, 1 или 0.

Для получения дополнительной информации ознакомьтесь с этой статьей MSDN о Булевых значениях и операторах .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...