How to pass boolean values to a PowerShell script from a command prompt

I have to invoke a PowerShell script from a batch file. One of the arguments to the script is a boolean value:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify $false

The command fails with the following error:

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

As of now I am using a string to boolean conversion inside my script. But how can I pass boolean arguments to PowerShell?

93
задан Peter Mortensen 13 July 2015 в 21:08
поделиться

3 ответа

К [1 139] подводят итог и дополнение существующие ответы , с Windows PowerShell v5.1 / 7.0.0-preview.4 Ядро PowerShell:

ответ David Mohundro законно точки, что вместо [bool] параметры необходимо использовать [switch] параметры в PowerShell, где присутствие по сравнению с отсутствием из имени переключателя (-Unify указанный по сравнению с [1 141] не указанный) подразумевает свое значение , который заставляет исходную проблему уйти.

<час>

Однако при случае Вы, возможно, все еще должны передать переключатель значение явно , особенно при построении командной строки программно :

<час>

В Ядре PowerShell , исходная проблема (описанный в [1 132] ответ XLII's Императора ) была , зафиксировал .

таким образом, для передачи $true явно [switch] параметр, названный -Unify, можно теперь записать:

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

следующие значения могут использоваться: $false, false, $true, true, но примечание, которое передача 0 или 1 делает не работа.

Примечание, как имя переключателя разделяется от значения с [1 114] и должно быть никакой пробел между двумя.

<глоток> Примечание: Если Вы объявляете [bool] параметр вместо [switch] (который Вы обычно не были должны), необходимо использовать тот же синтаксис; даже при том, что -Unify $false должен работа, она в настоящее время не делает - см. этот выпуск GitHub.

<час>

В [1 182] Windows PowerShell , исходная проблема сохраняется , и - учитывая, что Windows PowerShell активно больше не разрабатывается - вряд ли будет зафиксирован.

  • обходное решение, предложенное в [1 134] ответ LarsWA - даже при том, что это основано , официальная тема справки с этой записи - делает не работа в v5.1

    • , Этот выпуск GitHub просит документацию быть исправленным и также обеспечивает, тест управляют, чтобы показал неэффективность обходного решения.
  • Используя [1 118] вместо [1 119] единственное эффективное обходное решение :

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

С [1 120] Вы эффективно передаете часть кода PowerShell , который затем оценен, как обычно - и в PowerShell, передающем $true и $false работы (но не true и false, как теперь также принято с [1 125]).

Протесты :

  • Используя [1 126] может привести к дополнительной интерпретации Ваших аргументов, такой, как будто они содержат $ символы. (с [1 128], аргументы литералы ).

  • Используя [1 129] может привести к другой код выхода .

для получения дополнительной информации, видеть этот ответ и этот ответ .

0
ответ дан 24 November 2019 в 06:13
поделиться

У меня было что-то подобное при передаче сценария функции с вызывать-командой. Я выполнил команду в одинарных кавычках вместо двойных кавычек, потому что это тогда становится строковым литералом. 'Set-Mailbox $sourceUser -LitigationHoldEnabled $false -ElcProcessingDisabled $true';

0
ответ дан 24 November 2019 в 06:13
поделиться

В PowerShell булевы параметры могут быть объявлены путем упоминания их типа перед их переменной.

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

можно присвоить значение передающим $true | $false

    GetWeb -includeTags $true
1
ответ дан 24 November 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: