如何禁止将“假设”文本写入控制台

Cha*_*ynt 5 powershell

我通常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-FileHashWrite-Auditcmdlet 放在一个ShouldProcess()块中,那么我可以节省时间,但会在屏幕上写入 10k 或更多行。

我确信这个例子(实际上是我真正的代码)可以被重组以保持输出受到控制,或者我可以忽略 WhatIf 的冗长,但碰巧今天我想知道我是否可以抑制输出......