Как передать логические значения в сценарий 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 ответов:
похоже, что 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 на логические значения и Операторы.