我使用PowerShell已经很多年了,认为自己掌握了一些它更加“古怪”的行为,但是现在有一个问题让我无从下手...
我一直使用"return"从函数中返回值,但最近我想尝试Write-Output作为替代方案。然而,由于PowerShell就是PowerShell,我发现了一些看起来毫无意义的事情(至少对我来说是这样):
function Invoke-X{ write-output @{ "aaa" = "bbb" } };
function Invoke-Y{ return @{ "aaa" = "bbb" } };
$x = Invoke-X;
$y = Invoke-Y;
write-host $x.GetType().FullName
write-host $y.GetType().FullName
write-host ($x -is [hashtable])
write-host ($y -is [hashtable])
write-host ($x -is [pscustomobject])
write-host ($y -is [pscustomobject])
输出:
System.Collections.Hashtable
System.Collections.Hashtable
True
True
True
False
$x和$y之间的区别是什么(或者是'Write-Output'和'Return')意味着它们两个都是哈希表,但只有其中一个'-is'一个pscustomobject?是否有一种概括的方法可以从代码中确定差异性,而不是明显地检查我在变量中拥有的每个哈希表也是一个pscustomobject?如果这种行为特定于PowerShell的特定版本,则我的$PSVersionTable如下:
Name Value
---- -----
PSVersion 5.1.16299.492
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.16299.492
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
加油!
M
$x -is [pscustomobject]
更改为$x -is [System.Management.Automation.PSCustomObject]
,现在它表现出我预期的行为。 - mclaytonreturn
结束了函数:function Invoke-X{ write-output "output"; return "return" }
(返回包含output
和return
的数组) 与function Invoke-Y{ return "return"; write-output "output" }
(返回字符串return
)。 - sschoofreturn
是一种流程控制语句,它无条件地退出封闭的函数、脚本块或脚本 - 请参阅 about_Return。return <some-command-or-expression>
只是<some-command-or-expression>; return
的语法糖。 - mklement0