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 >$null
、2 | 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] (...)
作为 表达式 的一部分会导致 error 在 Windows PowerShell 中生成 error 在 Windows 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.
我有一个函数是 运行 一些代码和 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 >$null
、2 | 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] (...)
作为 表达式 的一部分会导致 error 在 Windows PowerShell 中生成 error 在 Windows 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.