PowerShell 参数字符串始终在单引号中



我有一个带有强制参数的脚本,我们用它来安装一些SQL组件,包括用户名和密码,如下所示:

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

因此,当用户运行此脚本时,他/她需要包含 -SqlServerPassword "SpecialCharacters" 变量字符串。我知道最佳做法是将字符串放在单引号内,但是培训我们的一些安装经理是一条艰难的道路,而且由于我们的密码库包含没有单引号会导致问题的特殊字符而搞砸了。

如何重写上述内容以确保即使用户传递密码而不使用单引号,它也会在单引号中?谢谢!

如果要将字符串作为参数传递,则无法完成您所要求的操作,因为这需要停用命令行解析器 - 该机制识别单个参数,评估其中包含的变量引用和子表达式,并将它们绑定到参数。

使用一组有限的特殊字符,您可以忽略解析器绑定的值并手动解析$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语句编写的。

最新更新