Whatif 和 ConfirmImpact 应该有 else 子句吗?

Should Whatif and ConfirmImpact have an else clause?

我想在我的函数中包含 WhatifConfirm,但我遇到了这些参数的问题。 我的函数结构如下:

function Get-Stuff {
  [CmdletBinding(SupportsShouldProcess, ConfirmImpact='High')]
  param ( {...} )
  process {
    if ($PSCmdlet.ShouldProcess($Name, "Delete user")) {
      $result = Invoke-RestMethod @restBody            
    }
  }
  end {
    Write-Output -InputObject $result
    Remove-Variable -Name result
  }
}

我养成了使用 Remove-Variable 清理结束块中的变量的习惯。当我现在使用 -WhatIf-Confirm 参数(并拒绝它)时,我得到一个错误,指出 $result 变量为空。

ErrorRecord                 : Cannot find a variable with the name 'result'.

我知道在这种情况下会跳过 RestMethod,但我认为该函数的其余部分不会进一步执行。

我现在的问题是,是否添加了一个 else 子句来结束函数的继续执行,或者我是否错误地使用了这些参数?

没有充分理由删除 end 中的变量,因为它们无论如何都会自动超出范围,因为它们是您函数的本地变量.

(唯一有意义的是 .Dispose() 包含实现 System.IDisposable 接口的对象的变量;如果尽快释放内存是最重要的——以暂时阻止执行为代价- 您还可以调用 [GC]::Collect(); [GC]::WaitForPendingFinalizers())

如果你还想调用Remove-Variable,你有两个选择:

  • 通过在 Remove-Variable 调用中添加 -ErrorAction Ignore 忽略 一个不存在的变量。

    Remove-Variable -Name result -ErrorAction Ignore
    
  • 或者,保护调用 - 和 Write-Output 对象 - 对变量的存在进行显式测试:

    if (Get-Variable -Scope Local result -ErrorAction Ignore) {
      $result # short for: Write-Output -InputObject 
      Remove-Variable -Name result
    }
    

另请注意,输出对象通常直接从 process 发出 - 从 end 块发出只是必要的出于概念原因必须首先收集所有输入的命令,例如 Sort-Object.

process 块发出输出对象 - 为每个输入对象 调用 - 确保 流输出行为 - 发射对象 一个接一个 ,只要它们可用 - 管道是为这些对象设计的。