我有一个带有强制性参数的脚本,我们可以使用该脚本来安装一些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
上面的单独语句编写的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句