You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell计算文件SHA1遇McAfee锁定,如何添加重试逻辑?

解决文件锁定问题的PowerShell SHA1计算代码(带重试机制)

首先,原代码存在潜在问题:直接获取StreamReader.BaseStream后,StreamReader对象可能被PowerShell的垃圾回收机制提前回收,导致流意外关闭。结合你提到的McAfee锁定文件的情况,我们可以添加重试逻辑,同时优化流的处理方式,确保资源正确释放。

优化后的代码(含1-2分钟随机重试)

$retryCount = 3  # 重试次数
$minRetryDelay = 60  # 最小重试间隔(秒,1分钟)
$maxRetryDelay = 120  # 最大重试间隔(秒,2分钟)

ForEach ($Filepath in $BaselineFile_NME, $DailyOutputFile_NME) {
    $hashComputed = $false
    $attempt = 0
    
    while (-not $hashComputed -and $attempt -lt $retryCount) {
        try {
            $SHA1 = [Security.Cryptography.HashAlgorithm]::Create("SHA1")
            # 使用FileStream打开文件,指定FileShare.ReadWrite减少锁定冲突
            $stream_HSH = [System.IO.File]::Open($Filepath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
            $hashBytes = $SHA1.ComputeHash($stream_HSH)
            $hashString = -join ($hashBytes | ForEach-Object { "{0:x2}" -f $_ })
            
            Write-Host "文件 $Filepath 的SHA1哈希值:$hashString"
            
            $stream_HSH.Close()
            $SHA1.Dispose()
            $hashComputed = $true
        }
        catch [System.IO.IOException] {
            $attempt++
            if ($attempt -lt $retryCount) {
                $delay = Get-Random -Minimum $minRetryDelay -Maximum $maxRetryDelay
                Write-Warning "尝试 $attempt 失败:$($_.Exception.Message),将在 $delay 秒后重试..."
                Start-Sleep -Seconds $delay
            }
            else {
                Write-Error "重试 $retryCount 次后仍无法访问文件 $Filepath:$($_.Exception.Message)"
            }
        }
        catch {
            Write-Error "处理文件 $Filepath 时发生未知错误:$($_.Exception.Message)"
            break
        }
    }
}

关键改进点

  • 重试机制:设置最多3次重试,每次间隔1-2分钟随机值,避免固定间隔导致的重复冲突
  • 流处理优化:使用[System.IO.File]::Open()替代StreamReader,显式指定FileShare.ReadWrite,降低文件锁定冲突概率
  • 资源释放:手动调用Dispose()释放哈希算法对象,确保资源正确回收
  • 错误捕获:针对性捕获IOException(文件锁定类错误),区分其他未知错误

额外说明

如果McAfee的锁定时间较长,可以适当调整$retryCount(重试次数)或延长$maxRetryDelay(最大重试间隔)。另外,确保运行脚本的账户对目标文件有读取权限。

内容的提问来源于stack exchange,提问作者pithhelmet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:34:54