Мне нужно вызвать сценарий 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 логические аргументы?
источник
Более понятным вариантом может быть использование вместо этого параметров переключения. Тогда только наличие параметра Unify будет означать, что он установлен.
Вот так:
источник
[switch] $Unify = $false
$false
. Таким образом, нет необходимости явно устанавливать значение по умолчанию.Это более старый вопрос, но на самом деле ответ на него есть в документации PowerShell. У меня была та же проблема, и на этот раз RTFM действительно ее решил. Почти.
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe
В документации для параметра -File указано, что «В редких случаях может потребоваться предоставить логическое значение для параметра переключателя. Чтобы предоставить логическое значение для параметра переключателя в значении параметра файла, заключите имя параметра и значение в фигурные скобки, например: -File. \ Get-Script.ps1 {-All: $ False} "
Пришлось написать так:
Итак, перед утверждением true / false нет символа «$», и это сработало для меня в PowerShell 4.0.
источник
powershell -h
.$
); также обратите внимание, что в PowerShell Core он больше не нужен . Я попросил исправить документацию; см. github.com/MicrosoftDocs/PowerShell-Docs/issues/4964Попробуйте установить тип вашего параметра на
[bool]
:В этом примере по умолчанию
$Unity
в$false
случае не предусмотрено никакого входа.использование
источник
-File
параметра должны охватывать все аспекты исходного вопроса. Я оставлю свой ответ, потому что кто-то может также найти мою подсказку о предоставлении значения по умолчанию.Я думаю, что лучший способ использовать / установить логическое значение в качестве параметра - использовать в вашем скрипте PS это так:
Итак, теперь вы можете использовать это так:
Таким образом, в аргументах из cmd вы можете передать логическое значение как простую строку :).
источник
В PowerShell логические параметры можно объявить, указав их тип перед их переменной.
Вы можете присвоить значение, передав $ true | $ false
источник
Для того, чтобы обобщить и дополнить существующие ответы , начиная с Windows PowerShell v5.1 / PowerShell Core 7.0.0-preview.4:
Ответ Дэвида Мохундро справедливо указывает на то, что вместо
[bool]
параметров вы должны использовать[switch]
параметры в PowerShell , где наличие или отсутствие имени переключателя (-Unify
указанного или не указанного) подразумевает его значение , что устраняет исходную проблему.Тем не менее, в некоторых случаях вам может потребоваться передать переключатель значение явно , особенно если вы построения командной строки программно :
В PowerShell ядро , то исходная задача (описанный в ответ императора XLII в ) была фиксированной .
То есть, чтобы
$true
явно перейти к[switch]
параметру с именем-Unify
, теперь вы можете написать:Могут быть использованы следующие значения:
$false
,false
,$true
,true
, но заметьте , что передача0
или1
же не работать.Обратите внимание, как имя переключателя отделяется от значения с помощью
:
и между ними не должно быть пробелов .Примечание. Если вы объявляете
[bool]
параметр вместо[switch]
(чего обычно не следует), вы должны использовать тот же синтаксис; хотя-Unify $false
должно работать, в настоящее время это не так - см. эту проблему на GitHub .В Windows PowerShell , в оригинальной проблема не решена , и - учитывая , что Windows PowerShell больше не активно развивается - вряд ли исправлена.
Обходной путь, предложенный в ответе LarsWA - хотя он основан на официальной теме справки на момент написания этой статьи - не работает в v5.1
Использование
-Command
вместо-File
- единственный эффективный обходной путь :Таким образом,
-Command
вы эффективно передаете фрагмент кода PowerShell , который затем оценивается как обычно - а внутри PowerShell передает$true
и$false
работает (но неtrue
иfalse
, как теперь принято с-File
).Предостережения :
Использование
-Command
может привести к дополнительной интерпретации ваших аргументов, например, если они содержат$
символы. (с-File
аргументами являются литералами ).Использование
-Command
может привести к другому коду выхода .Подробнее см. Этот ответ и этот ответ .
источник
У меня было нечто подобное при передаче скрипта функции с помощью invoke-command. Я выполнил команду в одинарных кавычках вместо двойных, потому что тогда она становится строковым литералом.
'Set-Mailbox $sourceUser -LitigationHoldEnabled $false -ElcProcessingDisabled $true';
источник
Выполнение сценариев powershell в Linux из bash дает ту же проблему. Решил это почти так же, как ответ LarsWA:
Работает:
Не работает:
источник
Вы также можете использовать
0
дляFalse
или1
дляTrue
. На самом деле это говорит о том, что в сообщении об ошибке:Для получения дополнительной информации ознакомьтесь с этой статьей MSDN о логических значениях и операторах .
источник
-File
интерпретирует его как строку, поэтому происходит сбой с той же ошибкой.