将powershell中的默认值传递给另一个脚本

时间:2014-08-16 16:58:59

标签: powershell

假设:

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

2 个答案:

答案 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。

enter image description here

最后,这是另一个展示splatting PSBoundParameters的示例,甚至更少的代码:

enter image description here

Get-Help about_Splatting或Google搜索" PowerShell splatting"如果需要,将提供更多示例!