我通常在我的 PowerShell 函数中使用 SupportsShouldProcess$PSCmdlet.ShouldProcess() 以便我可以理智地检查脚本将要做什么。通常我只围绕会改变环境的 Action 来实现这一点,例如 Add- , New- , Set- cmdlet 等。在某些情况下,我还想在使用 -WhatIf 开关运行脚本时绕过 Get- cmdlet。例如:

我有一个脚本,可以在对每个文件执行某些操作之前使用 Get-FileHash 对文件夹中的所有文件进行指纹识别。在这个例子中,有 10k+ 个文件,平均大小为 100MB 或更多,我不想在使用 -WhatIf 时花时间实际对文件进行指纹识别。我无法将整个操作包装起来只是一个 $PSCmdlet.ShouldProcess("All Files","Get-FileHash") 块。

为循环中的每个项目运行 $PSCmdlet.ShouldProcess() 的效果是我将数千行“假设:”文本转储回控制台。

问题 :有没有办法使用 $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 }
  }
}

假设将保留 95% 的文件,因此在此示例中,我们“仅”在屏幕上获得 500 行 WhatIf 输出,但花时间散列文件和编写审计日志(假设后者正在调用 REST API 或其他东西)这在多次迭代中很慢)。

如果我将 Get-FileHashWrite-Audit cmdlet 放在 ShouldProcess() 块中,那么我可以节省时间,但会向屏幕写入 10k 或更多行。

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

最佳答案

我怀疑您是否可以抑制 ShouldProcess 输出。作为解决方法,您可以检查 -whatif 参数中是否存在 $PSBoundParameters :

if ($PSBoundParameters.ContainsKey('WhatIf'))
{
   # do something here without
}

关于powershell - 如何抑制写入控制台的 "What if"文本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42004311/

10-10 13:04