我正在寻找一种方法让PowerShell脚本询问一个需要强制的参数,但是显示一个默认值,例如:
.\psscript
Supply values for the following parameters:
parameter1[default value]:
parameter2[1234]:
我想要求输入但提供一些默认值。
如果我使用强制选项,它会很好地询问值,但不会显示默认值或处理给定值。如果我没有强制要求,那么PowerShell根本不会要求这个价值。
这是我尝试过的一些脚本示例:
[CmdletBinding()]
Param(
[parameter(Mandatory=$true)] $SqlServiceAccount = $env:computername + "_sa",
[parameter(Mandatory=$true)] $SqlServiceAccountPwd
)
如果我只按第一个参数的Enter键,此脚本会询问参数,但不会显示或处理默认值。
[CmdletBinding()]
Param(
[parameter(Mandatory=$false)] $SqlServiceAccount = $env:computername + "_sa",
[parameter(Mandatory=$true)] $SqlServiceAccountPwd
)
此脚本不会要求第一个参数,但会处理默认值。
答案 0 :(得分:5)
这是一个可能有用的简短示例:
[CmdletBinding()]
Param(
$SqlServiceAccount = (Read-Host -prompt "SqlServiceAccount ($($env:computername + "_sa"))"),
$SqlServiceAccountPwd = (Read-Host -prompt "SqlServiceAccountPwd")
)
if (!$SqlServiceAccount) { $SqlServiceAccount = $env:Computername + "_sa" }
...
答案 1 :(得分:3)
没有办法通过强制参数和powershell提示你做你想做的事。
您必须将其设为可选(删除必填),然后自行实施提示代码(Read-Host
,但默认采用空白响应;类似的事情。)
答案 2 :(得分:3)
根据定义:强制参数没有默认值。即使您提供了一个,PowerShell也会提示输入值,除非在调用该命令时指定。然而,有一种'hacky'方式可以满足您的要求。由于变量(以及结果 - 参数)可以包含您希望的任何名称,因此使用与您希望看到的提示相匹配的参数来定义命令就足够了:
function foo {
param (
[Parameter(Mandatory = $true)]
[Alias('Parameter1')]
[AllowNull()]
${Parameter1[default value]},
[Parameter(Mandatory = $true)]
[Alias('Parameter2')]
[AllowNull()]
${Parameter2[1234]}
)
$Parameter1 =
if (${Parameter1[default value]}) {
${Parameter1[default value]}
} else {
'default value'
}
$Parameter2 =
if (${Parameter2[1234]}) {
${Parameter2[1234]}
} else {
1234
}
[PSCustomObject]@{
Parameter1 = $Parameter1
Parameter2 = $Parameter2
}
}
当调用w / o参数时,函数将向用户显示匹配参数名称的提示。使用-Parameter1 notDefaultValue
和/或-Parameter2 7
调用时,别名将启动并将传递的值分配给所选参数。由于这样的变量没有任何乐趣 - 将值(默认值或由用户传递)赋给与我们的别名/伪参数名称匹配的变量是有意义的。
答案 3 :(得分:1)
我会这样做
param(
[Parameter(Mandatory)][string]$aString
)
if([string]::IsNullOrWhiteSpace($aString))
{
$aString = "A Default Value"
}
我认为,如果您在Read-Host
块中使用param()
,那么您做错了什么。那时,完全使用param()
有什么意义?