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
相关产品推荐
相关产品推荐

