powershell – 为什么我需要首先splat到变量

为了清理我的编码风格,我一直在玩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上提交一个功能请求.为了获得更易读的脚本,预先创建哈希表仍然是一个很小的代价.

点赞