我通常SupportsShouldProcess
在 PowerShell 函数中使用$PSCmdlet.ShouldProcess()
,以便我可以对脚本将要执行的操作进行健全性检查。一般来说,我仅围绕将更改环境的操作来实现此操作,例如Add-、New-、Set- cmdlet 等。在某些情况下,我还想在使用开关运行脚本时绕过Get--WhatIf
cmdlet 。例如:
我有一个脚本,可以在对每个文件执行某些操作Get-FileHash
之前对文件夹中的所有文件进行指纹识别。在此示例中,有 10k+ 个文件,平均大小为 100MB 或更大,当我使用. 我无法将整个操作包装为一个块。-WhatIf
$PSCmdlet.ShouldProcess("All Files","Get-FileHash")
在循环中运行每个项目的效果$PSCmdlet.ShouldProcess()
是,我将数千行“What if:”文本转储回控制台。
问题:有没有办法使用$PSCmdlet.ShouldProcess()
它而不写入控制台?如果没有,人们可以使用什么解决方法?
示例代码
虽然我认为这个问题只是在抽象意义上起作用,但这是一个非常实用的论坛,所以这里是我上面提到的任务的一个简单示例:
$Files = Get-ChildItem -Path <ReallyBigFolder>
foreach($File in $Files){
$Action = Get-MyAction -Filename -$File.Fullname
# Take hash of file
$Hash = Get-FileHash -Path -$File.Fullname
# Keep audit happy
Write-Audit -Action $Action -Hash $Hash
switch($Action){
"Retain" {
# do nothing
break
}
"Remove" {
if($PSCmdlet.ShouldProcess($File.Fullname,"Remove-Item")){
Remove-Item $File.Fullname
}
break
}
default { # barf }
}
}
Run Code Online (Sandbox Code Playgroud)
假设 95% 的文件将被保留,因此在这个示例中,我们“仅”在屏幕上获得 500 行 WhatIf 输出,但花时间对文件进行哈希处理并写入审核日志(假设后者正在调用 REST API 或其他内容)这在多次迭代中很慢)。
如果我将Get-FileHash
和Write-Audit
cmdlet 放在一个ShouldProcess()
块中,那么我可以节省时间,但会在屏幕上写入 10k 或更多行。
我确信这个例子(实际上是我真正的代码)可以被重组以保持输出受到控制,或者我可以忽略 WhatIf 的冗长,但碰巧今天我想知道我是否可以抑制输出......
我怀疑你能抑制ShouldProcess
输出。作为解决方法,您可以检查该-whatif
参数是否存在于$PSBoundParameters
:
if ($PSBoundParameters.ContainsKey('WhatIf'))
{
# do something here without
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1495 次 |
最近记录: |