Whatif 和 ConfirmImpact 应该有 else 子句吗?
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
变量为空。
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
块发出输出对象 - 为每个输入对象 调用 - 确保 流输出行为 - 发射对象 一个接一个 ,只要它们可用 - 管道是为这些对象设计的。
我想在我的函数中包含 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
变量为空。
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
块发出输出对象 - 为每个输入对象 调用 - 确保 流输出行为 - 发射对象 一个接一个 ,只要它们可用 - 管道是为这些对象设计的。