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

时间:2016-02-03 21:33:37

标签: powershell

为了清理我的编码风格,我一直在玩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建议 - 随意去投票。

2 个答案:

答案 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别名%会更加简洁。