簡體   English   中英

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變量是 null。

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

我知道在這種情況下會跳過 RestMethod,但我會假設 function 的 rest 不會進一步執行。

我現在的問題是,是否添加了一個 else 子句來結束 function 的繼續執行,還是我錯誤地使用了這些參數?

沒有充分的理由刪除end塊中的變量,因為它們 go 無論如何都會自動從 scope 中取出,因為它們是 function 的本地變量。

(唯一有意義的是.Dispose()包含實現System.IDisposable接口的對象的變量;如果盡快釋放 memory 是最重要的 - 以暫時阻塞執行為代價 - 你可以另外調用[GC]::Collect(); [GC]::WaitForPendingFinalizers() )

如果您仍想調用Remove-Variable ,您有兩種選擇:

  • 只需在Remove-Variable調用中添加-ErrorAction Ignore即可忽略不存在的變量。

     Remove-Variable -Name result -ErrorAction Ignore
  • 或者,通過顯式測試變量的存在來保護調用 - 和Write-Output object:

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

另請注意, output 對象通常直接從process塊發出- 從end塊發出只是出於概念原因必須首先收集所有輸入的命令的必要性,例如Sort-Object

process塊中發出 output 對象 -為每個輸入 object調用 - 確保流式 output 行為-一個一個地發出對象,一旦它們被設計為管道可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM