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

PowerShell脚本删除Windows 10重复音乐文件报错求助

问题分析与修正方案

脚本的核心问题

  1. 错误访问不存在的属性:Get-FileHash返回的是Microsoft.PowerShell.Commands.FileHash对象,仅包含Algorithm、Hash、Path三个属性,没有FullName。脚本里用$DuplicateFile.FullName会返回null,直接导致Remove-Item因参数为空报错。
  2. 长路径/特殊字符解析失败:你的音乐文件路径包含超长名称和特殊符号,默认PowerShell对长路径支持有限,Resolve-Path无法正确识别这类路径,抛出找不到文件的错误。
  3. 对象比较逻辑不可靠:直接用$DuplicateFile -ne $_.Group[0]对比整个FileHash对象,可能因路径大小写、元数据差异等出现误判,不如通过索引跳过第一个文件的逻辑稳定。

修正后的脚本

# 启用长路径支持(适用于PowerShell 7+或Windows 10 1607及以上版本)
$ErrorActionPreference = "Stop"
try {
    # 尝试设置长路径注册表项(需管理员权限,已设置可忽略)
    Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name 'LongPathsEnabled' -Value 1 -ErrorAction SilentlyContinue
} catch {}

# 指定要搜索的文件夹
$FolderPath = "C:\Users\Ben\Music\Apple Music\Media\Music"

# 获取所有文件,用-LiteralPath避免路径解析错误
$Files = Get-ChildItem -LiteralPath $FolderPath -Recurse -File

# 按哈希分组识别重复文件
$Files | Get-FileHash -LiteralPath { $_.FullName } | Group-Object -Property Hash | Where-Object { $_.Count -gt 1 } | ForEach-Object {
    # 遍历重复组,从第2个文件开始删除(保留第一个副本)
    for ($i = 1; $i -lt $_.Group.Count; $i++) {
        $duplicatePath = $_.Group[$i].Path
        Write-Host "Deleting: $duplicatePath"
        # 用-LiteralPath处理特殊字符/长路径
        Remove-Item -LiteralPath $duplicatePath -Force
    }
}
pause

关键修改说明

  • 替换FullName为Path:直接使用Get-FileHash返回的Path属性获取文件路径,避免属性不存在的问题。
  • 适配长路径与特殊字符:通过修改注册表开启Windows长路径支持,同时在所有路径操作中使用-LiteralPath,避免PowerShell解析特殊字符时出错。
  • 改用索引遍历逻辑:通过for循环从索引1(第二个文件)开始删除,跳过第一个文件,逻辑更直接可靠,避免对象比较的潜在问题。
  • 简化错误处理:设置全局错误偏好,并静默处理注册表设置的错误,减少不必要的干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:40:53