PowerShell 强制转换为 void 并返回值



>我有一个函数,它正在运行一些代码,并在成功的情况下返回$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 推断函数返回值中的类型,这将起作用,但有趣的是我检查变量的内容

function New-SampleFunction
{
[void]::('2')
return $true
}
$myReturnValuen = New-SampleFunction

$returnValue.GetType()
IsPublic IsSerial Name                                     BaseType                                                                                                                           
-------- -------- ----                                     --------                                                                                                                           
True     True     Object[]                                 System.Array

但是如果我运行$returnValue来获取会员,我得到的就是这个

$returnValue | Get-Member

TypeName: System.Boolean

问题很容易解决,将上面的代码更改为

function New-SampleFunction
{
[void]('2')
return $true
}
$myReturnValuen = New-SampleFunction

代码中的问题已解决,但我现在很好奇为什么会这样,我当然错过了两个 void 和 [void]::(blahblah( 之间的区别,并且找不到任何明显的答案。

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

谢谢!

抑制返回值的最简单形式,它使用$null = ...

$null = 2

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


至于你尝试过的

[void]::('2')

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

由于[void]类型没有这样的静态成员(属性或方法(,因此$null被有效地返回[2]- 并且$null确实会得到管道的输出,因此您的函数有2个输出,$null$true

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


[1] 有趣的是,尝试使用[void] (...)作为表达式的一部分会导致Windows PowerShell中的错误在Windows PowerShell中生成错误(例如,([void] 1), 2(,而在PowerShellCore中,它现在更明智地被视为$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.

相关内容

  • 没有找到相关文章

最新更新