为了清理我的编码风格,我一直在玩splatting(知道反叛的程度有多大),所以我们最终得到这样的东西
$splat = @{
"ResourceGroupName" = $ResourceGroupName
"Location" = $location
"WhatIf" = $true
"ErrorVariable" = "err"
"ErrorAction" = "SilentlyContinue"
}
New-ResourceGroup @splat
对我来说一直觉得不自然,我不喜欢参数在cmdlet之前出现。它让我感到烦恼!
所以我很好奇为什么这样做不起作用。 (以及是否可以这样做)
New-ResourceGroup @{
"ResourceGroupName" = $ResourceGroupName
"Location" = $location
"WhatIf" = $true
"ErrorVariable" = "err"
"ErrorAction" = "SilentlyContinue"
}
对我来说,感觉更自然。有没有办法做到这一点?或者我永远注定要把车推到马前......
已修改以添加
如果没有答案,我发布了Uservoice建议 - 随意去投票。
答案 0 :(得分:1)
不幸的是,这不可能是AFAIK。问题是@splat
不是简单地传递哈希表(它是单个值)。与简单读取变量的$
不同,splatting-operator @
拆分单个对象(集合)并将其与参数匹配。此外,除了传递参数值之外,splatting-operator不能用于任何其他操作。
PS C:\Users\frode> @splat
At line:1 char:1
+ @splat
+ ~~~~~~
The splatting operator '@' cannot be used to reference variables in an expression. '@splat' can be used only a
s an argument to a command. To reference variables in an expression use '$splat'
因此,我们不能在子表达式(例如dir @(@{ Filter = "notepad.exe" })
)或类似的东西中使用它,以便能够直接在cmdlet调用中创建哈希表。
我同意这很好,我建议在PowerShell @ UserVoice上提交功能请求。为了获得更易读的脚本,预先创建哈希表仍然是一个很小的代价。
答案 1 :(得分:0)
TesselatingHacker presents another potential workaround这不是一半坏。将哈希表传递给管道并将管道对象splat到cmdlet / function。
@{
Filter = "*.txt"
Path = "d:\temp"
File = $true
} | ForEach-Object{Get-ChildItem @_}
仍然易于阅读,仍然保持可读性。如果您希望ForEach-Object
别名%
会更加简洁。