PowerShell强制转换为void并返回值
我有一个函数,它运行一些代码,如果成功则返回$True,否则返回$False 作为函数代码的一部分,我使用以下命令将某些cmdlet的结果强制转换为[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
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模糊了我对此类“问题”的理解/阐述能力。