为了清理我的编码风格,我一直在玩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的建议 – 随意去投票.
最佳答案 不幸的是,这不可能是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上提交一个功能请求.为了获得更易读的脚本,预先创建哈希表仍然是一个很小的代价.