我通常在我的 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-FileHash
和 Write-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/