gpt4 book ai didi

powershell - 如何抑制写入控制台的 "What if"文本

转载 作者:行者123 更新时间:2023-12-02 22:17:25 25 4
gpt4 key购买 nike

我常用SupportsShouldProcess在我的 PowerShell 函数中以及 $PSCmdlet.ShouldProcess()所以我可以理智地检查脚本将要做什么。通常我只围绕会改变环境的 Action 来实现这一点,例如地址- , 新品- , 套装- cmdlet 等。在某些情况下,我还想绕过 获取- 使用 -WhatIf 运行脚本时的 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 ShouldProcess() 中的 cmdlet阻止然后我节省了时间,但将 10k 或更多行写入屏幕。

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

最佳答案

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com