PowerShell强制转换为void并返回值

PowerShell强制转换为void并返回值,powershell,null,void,Powershell,Null,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

我有一个函数,它运行一些代码,如果成功则返回$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>$null
2 | Out null
[void](2)
[1]


至于你所尝试的:

$null = 2
[void]:('2')

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

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

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


[1] 有趣的是,尝试将
[void](…)
用作表达式的一部分会在Windows PowerShell中产生错误(例如,
([void]1),2
),而在PowerShell核心中,它现在更明智地被视为
$null
(使用
$null-eq([void]1),2)[0]

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


在此对象上找不到属性“2”。验证属性是否存在。

另一种方法是使用
'2'| Out Null
谢谢@KarthickGanesan我知道Out Null,但出于性能原因,请避免使用它。请记住,PowerShell函数返回所有输出,正如@Lee_Dailey指出的,您不强制转换,而是调用
静态成员运算符,所以你确实返回了一个数组。@Lee_Dailey yep我复制了这个数组,很有意义,你能分享更多关于引擎盖下到底发生了什么的细节吗?我仍然不知道细节,很想知道mroe。@LotPings感谢您回答我之前向Lee_dailey提出的问题。现在一切都清楚了,我终于明白了。完全disclouse the[void]::表单来自我的编辑器中的一个snipper。。。guess(滥用)intellisense模糊了我对此类“问题”的理解/阐述能力。