![](/img/trans.png)
[英]Powershell Function -WhatIf for cmdlet without the -WhatIf support?
[英]Should Whatif and ConfirmImpact have an else clause?
我想在我的函數中包含Whatif
和Confirm
,但我遇到了這些參數的問題。 我的函數結構如下:
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.