【问题标题】:Should Whatif and ConfirmImpact have an else clause?Whatif 和 ConfirmImpact 是否应该有一个 else 子句?
【发布时间】:2021-03-23 08:34:04
【问题描述】:

我想在我的函数中包含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 子句来结束函数的继续执行还是我错误地使用了这些参数?

【问题讨论】:

    标签: powershell confirm


    【解决方案1】:

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

    (唯一有意义的是.Dispose()包含实现System.IDisposable接口的对象的变量;如果尽快释放内存是最重要的——以暂时阻塞执行为代价——你可以另外调用@ 987654327@)

    如果您仍想拨打Remove-Variable,您有两种选择:

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

      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 块中发射输出对象 - 为每个输入对象调用 - 确保流输出行为 - 发射对象一个接一个,只要它们可用 - 管道就是为之设计的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 2023-03-15
      • 2011-06-06
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      相关资源
      最近更新 更多