重定向至Powershell中的$ null奇怪行为

问题描述 投票:5回答:1

有四种抑制输出的方法:

  1. 重定向到$null变量
    PS C:\> 1; $(2; return) > $null; 3
    1
    3
    
  2. Out-Null cmdlet配管
    PS C:\> 1; $(2; return) | Out-Null; 3
    1
    2
    
  3. 投射到[void]类型
    PS C:\> 1; [void]$(2; return); 3
    1
    2
    
  4. 分配给$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命令完全退出当前上下文

摘要

抑制命令输出的不同方法:

  1. [... > $null重定向到$null变量错误在PS 1.0和2.0中。在PS 3.0+中,输出可能与其他方法不同]]
  2. [... | Out-Null管道到Out-Null cmdlet性能问题*
  3. ] >>
  4. [[void]...转换为[void]类型Advisable
  5. $null = ...分配给$null变量Advisable
  6. 有四种抑制输出的方法:重定向到$ null变量PS C:\> 1; $(2; return)> $ null; 3 1 3到Out-Null cmdlet PS C:\> 1; $(2;返回)|空无; 3 1 2 ...

powershell null powershell-2.0 void
1个回答
4
投票
  • 2实际上是作为Write-Output 2执行的

© www.soinside.com 2019 - 2024. All rights reserved.