【发布时间】:2017-02-23 04:34:40
【问题描述】:
有四种方法可以抑制输出:
- 重定向到
$null变量PS C:\> 1; $(2; return) > $null; 3 1 3 - 管道到
Out-NullcmdletPS C:\> 1; $(2; return) | Out-Null; 3 1 2 - 转换为
[void]类型PS C:\> 1; [void]$(2; return); 3 1 2 - 分配给
$null变量PS C:\> 1; $null = $(2; return); 3 1 2
所有四种情况都应该是等价的。
为什么重定向到$null 的行为会有所不同?我遇到了错误吗?
另一个例子
此示例显示了 PS 2.0 中 > $null 命令的意外行为:
PS C:\> 1; $(Write-Output 2; Write-Host 3; return; Write-Host 4) > $null; 5
1
3
5
return 命令的行为就像它从某个嵌套上下文中退出(尽管没有创建它的命令),停止 $() 表达式执行,然后在当前上下文中继续执行(当它不应该执行时) Write-Output 5 命令。
行为说明
(来自wOxxOm's答案)
- 在 PS 1.0 和 2.0 中,
> $null操作在 之前$()表达式执行并抑制其输出;return命令不会退出当前上下文(被视为 BUG),但会停止$()表达式执行 - 在 PS 3.0 和更新的
> $null操作执行之前$()表达式并在所有情况下抑制其输出;return命令完全退出当前上下文 -
| Out-Null、[void]、$null =操作在$()表达式之后执行,如果其中没有return命令,则抑制其输出;return命令完全退出当前上下文
总结
抑制命令输出的不同方法:
-
... > $null重定向到$null变量
PS 1.0 和 2.0 中的错误。在 PS 3.0+ 中输出可能与其他方法不同 -
... | Out-Null管道到Out-Nullcmdlet
性能问题 * -
[void]...转换为[void]类型
建议 -
$null = ...赋值给$null变量
建议
【问题讨论】:
-
关于你的编辑:如果你不在表达式中使用
return,这看起来很奇怪,你可以安全地使用>$null,因为它比强制转换或分配更合适。 -
@wOxxOm 我可以问你一个例子,
> $null比强制转换或分配更合适吗? -
我的意思是主观上/语义上更合适。
标签: powershell null powershell-2.0 void