使用PowerShell Get-FileHash时文件打开状态的错误处理问题
解决PowerShell查找重复文件时因文件被占用导致命令终止的问题
你的问题出在当文件被占用时,Get-FileHash执行失败返回$null,后续Group-Object处理$null的Hash属性时触发空引用异常。虽然你用了-ErrorAction SilentlyContinue,但它只是抑制了Get-FileHash的错误提示,并没有处理返回的$null值,导致分组操作崩溃。
以下是修正后的命令,能自动跳过被占用的文件并继续执行:
Get-ChildItem -Recurse -File | Select-Object Length, FullName, @{ Name = "Hash" Expression = { try { # 尝试获取文件哈希,失败则抛出异常 (Get-FileHash -Algorithm MD5 -Path $_.FullName -ErrorAction Stop).Hash } catch { # 捕获文件占用等错误,返回null以便后续过滤 $null } } } | # 过滤掉哈希获取失败的文件(Hash为null的条目) Where-Object { $_.Hash -ne $null } | Group-Object -Property Hash | Where-Object { $_.Count -gt 1 } | ForEach-Object { $_.Group | Select-Object FullName, Hash, Length } | Export-Csv -Path C:\temp\filelist.csv -Delimiter "`t" -NoTypeInformation
关键修改点:
- 给
Get-ChildItem添加-File参数,只处理文件(目录不需要计算哈希,避免无效条目)。 - 用
try/catch包裹Get-FileHash,明确捕获文件占用等错误,确保失败时返回$null。 - 新增
Where-Object { $_.Hash -ne $null },直接过滤掉哈希获取失败的文件,避免Group-Object处理$null值引发异常。
这样修改后,命令遇到被打开的文件时会自动跳过,不会终止执行,最终只输出能正常计算哈希的重复文件。
内容的提问来源于stack exchange,提问作者JJ01
相关产品推荐
相关产品推荐

