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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:12:16