考虑这个 PowerShell 脚本:

[Hashtable] $t = @{}
function foo($x) { $x }
$t2 = foo $t
$t3 = {param([Hashtable] $x) [Hashtable]$x}.Invoke($t)
$t4 = $function:foo.Invoke($t)
Write-Host "argument type              " $t.GetType()
Write-Host "function call              " $t2.GetType()
Write-Host "script block Invoke        " $t3.GetType()
Write-Host "function variable Invoke   " $t4.GetType()

哪些输出:
argument type              System.Collections.Hashtable
function call              System.Collections.Hashtable
script block Invoke        System.Collections.ObjectModel.Collection`1[System.Management.Automation.PSObject]
function variable Invoke   System.Collections.ObjectModel.Collection`1[System.Management.Automation.PSObject]

为什么脚本块返回 Collection 而不是 Hashtable
如何让脚本块返回 Hashtable

使用的 PowerShell 版本:

$PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.0.0
PSEdition                      Core
GitCommitId                    7.0.0
OS                             Microsoft Windows 10.0.18363
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

最佳答案

看看 InvokeReturnAsIs 方法:

[Hashtable] $t = @{}
function foo($x) { $x }
$t2 = foo $t
$t3 = {param([Hashtable] $foo) [Hashtable]$foo}.InvokeReturnAsIs($t)
Write-Host $t.GetType()
Write-Host $t2.GetType()
Write-Host $t3.GetType()

哪些输出:
System.Collections.Hashtable
System.Collections.Hashtable
System.Collections.Hashtable

它似乎给出了您正在寻找的结果,但是 documentation 没有提供太多信息

关于powershell - 为什么 ScriptBlock 将 Hashtable 转换为 Collection 以及如何避免它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62013833/

10-13 01:10