Для узагальнення та доповнення існуючих відповідей станом на 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може призвести до а іншого коду виходу .
Детальніше див. Цю відповідь та цю відповідь .