PowerShell Param string всегда в одинарных кавычках - PullRequest
0 голосов
/ 12 июня 2018

У меня есть скрипт с обязательными параметрами, который мы используем для установки некоторых компонентов SQL, включая имя пользователя и пароли, как показано ниже:

param(    
[Parameter(Mandatory=$True,HelpMessage="SQL Server password")]
    [ValidateNotNullOrEmpty()]
    [string] $SqlServerPassword
)

Поэтому, когда пользователь запускает этот скрипт, он / она должен будет включитьпеременная строка -SqlServerPassword 'SpecialCharacters'.Я знаю, что лучшая практика - помещать строку в одиночную кавычку, но это был трудный путь обучения некоторых наших менеджеров по установке, и он запутался, потому что наше хранилище паролей содержит специальные символы, которые без одинарных кавычек вызывают проблемы.

Как я могу переписать вышеприведенное, чтобы гарантировать, что даже если пользователь введет пароль, не заключив его в одинарные кавычки, он будет в одинарных кавычках?Спасибо!

1 Ответ

0 голосов
/ 12 июня 2018

То, что вы просите, не может быть выполнено, если строка должна быть передана как аргумент , потому что для этого потребуется деактивировать анализатор командной строки - тот самый механизм, который распознает отдельные аргументы, оцениваетссылки на переменные и вложенные выражения, содержащиеся в них, и привязка их к параметрам.

При ограниченном наборе специальных символов вы можете игнорировать значение, связанное с анализатором, и вручную анализировать $MyInvocation.Line, необработанную командную строку, но не только потому, что он опрометчив, он будет разрываться с такими символами, как | и ;

Однако вы можете достичь желаемого с помощью интерактивной подсказки .Хотя вы также получаете такой запрос с вашим кодом, если пользователь не передает аргумент -SqlServerPassword в командной строке, он не предотвращает потенциально неправильное использование командной строки.(Кроме того, это автоматическое приглашение не является удобным для пользователя и имеет причуды, такие как невозможность начать значение с !).

Если это возможно, вы можете потребовать от пользователейвведите значение в интерактивном режиме (и также не разрешать передачу значения в качестве аргумента), используя Read-Host, и в этом случае цитирование не нужно и не должно использоваться:

param(
  # Do NOT define $SqlServerPassword as a parameter (but define others)
)

# Prompt the user for the password.
# The input is invariably treated as a literal.
Write-Host "Please enter the SQL Server password:"
[string] $SqlServerPassword = Read-Host

# Validate the user's input.
if (-not $SqlServerPassword) { Throw 'Aborted.' }
# ...

Примечание: Read-Host имеет параметр -Prompt, который принимает строку приглашения напрямую, но если вы будете использовать ее, вы не сможете ввести значения, начинающиеся с !;следовательно, приглашение было написано с отдельным оператором Write-Host выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...