PowerShell Param字符串始终以单引号显示

时间:2018-06-12 19:05:13

标签: powershell

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

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

因此,当用户运行此脚本时,他/她将需要包含-SqlServerPassword'SpecialCharacters'变量字符串。我知道最好的做法是将字符串放在单引号内,但是对我们的一些安装管理器进行培训是很困难的,因为我们的密码保险库包含了没有单引号导致问题的特殊字符。

如何重新编写上述内容以确保即使用户在没有单引号的情况下传递密码,也会使用单引号?谢谢!

1 个答案:

答案 0 :(得分:1)

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

使用一组有限的特殊字符,您可以忽略解析器绑定的值并手动解析原始命令行$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参数,它直接接受提示字符串,但是如果你要使用它,你将无法输入以{{{}开头的值。 1}};因此,提示是用上面单独的!语句写的。