Как передать логические значения в сценарий PowerShell из командной строки


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

C:WindowsSystem32WindowsPowerShellv1.0powershell.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 66

6 ответов:

похоже, что powershell.exe не полностью оценивает аргументы скрипта, когда -File параметр используется. В частности,

более четкое использование может заключаться в использовании параметров коммутатора. Тогда просто существование параметра 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 фактически решил ее. Почти.

https://technet.microsoft.com/es-es/library/hh847736.aspx?f=255&MSPPError=-2147217396

документация для параметра-File гласит, что "В редких случаях вам может потребоваться предоставить логическое значение для параметра switch. Чтобы предоставить логическое значение для коммутатора параметр в значение параметра File заключите имя и значение параметра в фигурные скобки, например: - File. \Get-Script. ps1 {- All:$False}"

Я должен был написать так:

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

поэтому нет " $ " перед утверждением true/false, и это сработало для меня, на PowerShell 4.0

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

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

для получения дополнительной информации, проверьте эту статью MSDN на логические значения и Операторы.