То, что вы просите, не может быть выполнено, если строка должна быть передана как аргумент , потому что для этого потребуется деактивировать анализатор командной строки - тот самый механизм, который распознает отдельные аргументы, оцениваетссылки на переменные и вложенные выражения, содержащиеся в них, и привязка их к параметрам.
При ограниченном наборе специальных символов вы можете игнорировать значение, связанное с анализатором, и вручную анализировать $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
выше.