PowerShell 转换为 void 和 return 值

PowerShell cast to void and return value

我有一个函数是 运行 一些代码和 return $True 如果成功,否则 $False。

作为函数代码的一部分,我使用这个

将一些 cmdlet 的结果转换为 [void]
function New-SampleFunction
{
    [void]::('2');

     return $true
}

[bool]$myReturnValuen = New-SampleFunction

# This results in exception
The above will result in a Cannot convert value "System.Object[]" to type "System.Boolean". Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.

当然,如果我让 PowerShell 推断函数 return 值中的类型,这将起作用,但有趣的是我检查变量

function New-SampleFunction
{
    [void]::('2')

     return $true
}

$myReturnValuen = New-SampleFunction


$returnValue.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                                           
-------- -------- ----                                     --------                                                                                                                           
True     True     Object[]                                 System.Array

但是如果我 运行 $returnValue to Get-Member 我得到的是这个

$returnValue | Get-Member


TypeName: System.Boolean

将上述代码更改为

问题很容易解决
function New-SampleFunction
{
    [void]('2')

     return $true
}

$myReturnValuen = New-SampleFunction

代码中的问题已解决,但我现在很好奇为什么会这样,我当然遗漏了 void 和 [void]::(blahblah) 两者之间的区别,但找不到任何显而易见的答案。

我可能忽略了一些非常愚蠢的东西(度过了非常艰难的一周......)但如果有人能启发我,我将不胜感激。

谢谢!

将 return 值压缩为 使用 $null = ...:

的最简单形式
$null = 2

其他,在大多数情况下不太理想的选项包括 2 >$null2 | Out-Null[void] (2)[1].


至于你试过的

[void]::('2')

尝试访问名为 2[=71= 的 [void] 类型的 静态成员 (::) ],这是表达式 ('2') 求值的名称 - 这显然不是您的意图。

由于 [void] 类型没有这样的静态成员(属性 或方法),$null 实际上是 returned[2] - 和 $null 确实 得到输出到管道,所以你的函数有 2 输出,$null$true.

如果您在变量中捕获它,您将得到一个 2 元素 [object[]] 数组 - $null, $true - 这解释了你的症状。


[1] 有趣的是,尝试使用 [void] (...) 作为 表达式 的一部分会导致 errorWindows PowerShell 中生成 errorWindows PowerShell (例如,([void] 1), 2),而在 PowerShell Core 中,它现在更明智地被视为 $null(用 $null -eq (([void] 1), 2)[0] 验证)。

[2] 请注意,您可以通过调用 Set-StrictMode -Version 2 或更高 来防止此类无意的方法/属性 引用。 然后您将收到以下语句终止错误:

The property '2' cannot be found on this object. Verify that the property exists.