【发布时间】:2013-12-20 16:21:53
【问题描述】:
我似乎经常发现自己设置了一堆变量并且我想将它们传递给一个函数(例如,将参数传递给另一个函数而不进行修改)。目前我最终会做这样的事情:
Get-RelatedThing -CompanyTag $CompanyTag -ProjectTag $ProjectTag -EnvName $EnvName
这看起来很冗长,而且可读性不强。我可以使用位置参数,但这会牺牲清晰度和兼容性。预先创建一个数组并进行喷溅只会造成垂直混乱而不是水平混乱(除非在我可以执行 Get-RelatedThing @PSBoundParameters 之类的异常情况下,但这有缺陷)。
我真正想要的是能够做这样的事情:
Get-RelatedThing @(Get-Variable CompanyTag,ProjectTag,EnvName)
但是 Get-Variable 返回一个 Object[] 并且 splatting 运算符只能解析命名参数的哈希表(或位置参数的数组)。我stole一个函数解决了这个问题:
function Get-VariablesAsHashtable {
[CmdletBinding()]
param
(
[Parameter(Position=0)]
[string[]] $Name
)
$ObjectArray = Get-Variable -Name @($Name)
$Hashtable = @{}
$ObjectArray | Foreach { $Hashtable[$_.Name] = $_.Value }
return $Hashtable
}
“提前”运行时有效:
# works
$calculatedVars = (Get-VariablesAsHashtable ProjectTag,EnvName,ComponentTag);
(Get-RelatedThing @calculatedVars);
但不是在运行“内联”时:
# fails
(Get-RelatedThing @(Get-VariablesAsHashtable ProjectTag,EnvName,ComponentTag));
Get-InitialThing : Cannot process argument transformation on parameter 'ProjectTag'. Cannot convert value to type System.String.
我是否遗漏了一些可以解决这种方法的东西?或者有更好的方法吗?
【问题讨论】:
标签: powershell