Как передать строку как не-строку в команду в powershell? - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь условно добавить параметры к команде, которую я вызываю в powershell. Однако, когда я пытаюсь, мой параметр передается в виде строки. Я не могу понять, как передать его в качестве идентификатора.

Это моя попытка:

$readParams = $(if ("2".Equals("2")) {"-AsSecureString"})
read-host 'Prompt' $readParams

Вывод, который я получаю:

Prompt -AsSecureString:

Я хочу иметь возможность установить $readParams по-разному в зависимости от условий. Если условие истинно, получите следующее поведение:

read-host 'Prompt' -AsSecureString

и если условие ложно, получите следующее поведение:

read-host 'Prompt'

Я хочу написать read-host только один раз в моей программе.

Как мне указать аргумент динамически, не передавая его в виде строки, в результате чего он становится частью приглашения, а не передаётся как параметр стиля идентификатора?

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Вы можете установить переключатель в положение true или false в зависимости от условия:

$readParams = $(if ("2".Equals("2")) {$true} else {$false})
read-host 'Prompt' -AsSecureString:$readParams
0 голосов
/ 17 сентября 2018

Если вы хотите заранее подготовить несколько параметров, используйте метод 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 типа отражает эффективное логическое значение переключателя (включен или выключен, свободно говоря), и не , является ли переключатель было явно передано пользователем.

0 голосов
/ 17 сентября 2018

Функция, которую вы ищете, называется splatting . Это позволяет вам представить хеш-таблицу для команды и интерпретировать ее как параметры.

$readParams=@{}
if("2".Equals("2")) {
  $readParams["AsSecureString"]=$true
}
read-host 'Prompt' @readParams
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...