假设:
setenv.ps1 :
param([Parameter(Mandatory=$false)][ValidateSet(541,642,643,644,645,"tmp")]$version=645)
echo "[setenv] Version = $version"
dbupdate.ps1 :
param($version)
. setenv $version
echo "[dbupdate] Version = $version"
输出:
PS C:\> dbupdate.ps1
c:\utils\setenv.ps1 : Cannot validate argument on parameter 'version'. The argument is null, empty, or an element of the argument collection contains a null value. Supply a collection that does not
contain any null values and then try the command again.
At c:\utils\dbupdate.ps1:3 char:10
+ . setenv $version
+ ~~~~~~~~
+ CategoryInfo : InvalidData: (:) [setenv.ps1], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,setenv.ps1
[dbupdate] Version =
我想在没有任何参数的情况下调用dbupdate.ps1
,这应该告诉setenv.ps1
使用$version
参数的默认值。但是,默认值是serenv.ps1
脚本的实现细节 - 我不希望它“泄漏”到dbupdate.ps1
。
我该怎么做?
修改
尝试遵循Cookie Monster的建议会产生以下错误:
c:\dayforce\utils\setenv.ps1 : Cannot validate argument on parameter 'version'. The argument "System.Collections.Hashtable"
does not belong to the set "541,642,643,644,645,tmp" specified by the ValidateSet attribute. Supply an argument that is in the
set and then try the command again.
At C:\dayforce\utils\dbupdate.ps1:9 char:10
+ . setenv $params
+ ~~~~~~~
+ CategoryInfo : InvalidData: (:) [setenv.ps1], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,setenv.ps1
答案 0 :(得分:0)
使用值null覆盖默认值。 validateset属性似乎导致该错误。我尝试添加allownull,allowemptystring和allowemptycollection并为集合添加了一个空值,但validateset仍然导致了该错误。作为替代方案,您可以这样做 -
if ($version) {
. .\setenv.ps1 $version
} else {
. .\setenv.ps1
}
答案 1 :(得分:0)
这是一个很好的用例来展示你的论点。特别是如果你需要为一个以上的参数做...
修改了dbupdate.ps1:
param($version)
#Build a hashtable containing the parameters and values you want to call
$params = @{}
if($version) { $params.version = $version }
. setenv @params
你甚至可以使用@PSBoundParameters,帮助系统就是这方面的一个例子。运行Get-Help about_Splatting获取更多信息!
编辑以澄清
不确定为什么会被投票。以下是验证此语法的工作原理。需要调用@params,而不是$ params。
最后,这是另一个展示splatting PSBoundParameters的示例,甚至更少的代码:
Get-Help about_Splatting或Google搜索" PowerShell splatting"如果需要,将提供更多示例!