Если вы хотите заранее подготовить несколько параметров, используйте метод splatting , описанный в Полезный ответ Майка Шепарда , который использует хеш-таблицу, ключи которой названы для параметров целевого командлета, а также работает с параметрами switch (в качестве альтернативы условному пропуску записи, названной для параметра switch, включите ее безоговорочно и назначьте $True
для эмуляции , передавая и $False
для эмуляции , опуская it [1] ).
Подробнее Полезный ответ Джейкоба Колвина :
Для параметра switch , такого как -AsSecureString
(необязательный логический параметр без аргумента), проблема заключается в том, что значение переключателя обычно подразумевается его присутствием ($True
) против отсутствия ($False
) [2] .
Однако - это синтаксис, который позволяет явно передавать значение , а именно , добавляя :<expr>
непосредственно к имени коммутатора , где <expr>
- выражение, значение которого преобразуется в логическое значение; для иллюстрации с автоматическими переменными $True
и $False
:
-AsSecureString:$True
... так же, как и просто -AsSecureString
-AsSecureString:$False
... обычно совпадает с не проходит -AsSecureString
[1]
Таким образом, вы можете решить вашу проблему следующим образом, используя выражение (заключенное в (...)
) непосредственно , без необходимости aux. переменная $readParams
:
Read-Host 'Prompt' -AsSecureString:('2' -eq '2')
* Очевидно, что значение выражения не должно быть инвариантным при реальном использовании.
* '2' -eq '2'
является эквивалентом PowerShell "2".Equals("2")
, хотя обратите внимание, что -eq
PowerShell * * по умолчанию не учитывает регистр , поэтому, строго говоря, -ceq
будет более близким аналогом.
[1] Иногда -SomeSwitch:$False
имеет семантику, отличную от , в которой вообще не используется, особенно при переопределении переменных предпочтения ad hoc. Например, если действует $VerbosePreference = 'Continue'
, чтобы все командлеты производили подробный вывод по умолчанию, вы можете использовать -Verbose:$False
в отдельных командах для его подавления.
[2] Строго говоря, параметр переменная внутри командлета / расширенная функция, представляющая переключатель параметр , имеет тип [switch]
(System.Management.Automation.SwitchParameter
); однако экземпляры этого типа эффективно ведут себя как логические значения.
Несколько запутанно, и вопреки тому, что написано в документации, свойство .IsPresent
типа отражает эффективное логическое значение переключателя (включен или выключен, свободно говоря), и не , является ли переключатель было явно передано пользователем.