Для того, чтобы обобщить и дополнить существующие ответы , начиная с Windows PowerShell v5.1 / PowerShell Core 7.0.0-preview.4:
Ответ Дэвида Мохундро справедливо указывает на то, что вместо [bool]параметров вы должны использовать [switch]параметры в PowerShell , где наличие или отсутствие имени переключателя ( -Unifyуказанного или не указанного) подразумевает его значение , что устраняет исходную проблему.
Тем не менее, в некоторых случаях вам может потребоваться передать переключатель значение явно , особенно если вы построения командной строки программно :
В PowerShell ядро , то исходная задача (описанный в ответ императора XLII в ) была фиксированной .
То есть, чтобы $trueявно перейти к [switch]параметру с именем -Unify, теперь вы можете написать:
pwsh -File .\RunScript.ps1 -Unify:$true # !! ":" separates name and value, no space
Могут быть использованы следующие значения: $false, false, $true, true, но заметьте , что передача 0или 1же не работать.
Обратите внимание, как имя переключателя отделяется от значения с помощью :и между ними не должно быть пробелов .
Примечание. Если вы объявляете [bool]параметр вместо [switch](чего обычно не следует), вы должны использовать тот же синтаксис; хотя -Unify $false должно работать, в настоящее время это не так - см. эту проблему на GitHub .
В Windows PowerShell , в оригинальной проблема не решена , и - учитывая , что Windows PowerShell больше не активно развивается - вряд ли исправлена.
Обходной путь, предложенный в ответе LarsWA - хотя он основан на официальной теме справки на момент написания этой статьи - не работает в v5.1
- Эта проблема GitHub требует исправления документации, а также предоставляет тестовую команду, которая показывает неэффективность обходного пути.
Использование -Commandвместо -File- единственный эффективный обходной путь :
:: # From cmd.exe
powershell -Command "& .\RunScript.ps1 -Unify:$true"
Таким образом, -Commandвы эффективно передаете фрагмент кода PowerShell , который затем оценивается как обычно - а внутри PowerShell передает $trueи $falseработает (но не true и false, как теперь принято с -File).
Предостережения :
Использование -Commandможет привести к дополнительной интерпретации ваших аргументов, например, если они содержат $символы. (с -Fileаргументами являются литералами ).
Использование -Commandможет привести к другому коду выхода .
Подробнее см. Этот ответ и этот ответ .