Copy-Item复制Windows用户配置文件时Documents冗余文件夹成因排查
问题原因
Windows 用户目录里的 Documents 文件夹下,My Music、My Pictures、My Videos 是 NTFS 连接点(Junction Point)——它们不是真实的独立文件夹,只是指向用户目录下 Music、Pictures、Videos 一级目录的链接。
你的 PowerShell 代码用 Copy-Item -Recurse 复制时,默认不会跟随这类连接点(除非加 -FollowSymlink 参数),而是会把它们当作普通空文件夹在备份目录里创建出来。再加上你是批量复制用户目录下除 AppData 外的所有项,Music、Pictures、Videos 会作为一级目录被单独复制,Documents 里的连接点因为找不到备份路径中对应的目标目录,最终就变成了冗余的空文件夹。
解决办法
有两种简单的处理方式:
方式1:复制时直接排除连接点
拆分复制逻辑,先处理除 Documents 和 AppData 外的目录,再单独复制 Documents 并排除那三个连接点:
$UserProfPath = "C:\Users\" + $UserID $UserBkpPath = $BackupLocation + "\" + $UserID # 复制用户目录下除AppData、Documents外的所有一级目录 Copy-Item -Path (Get-Item -Path "$UserProfPath\*" -Exclude 'Appdata', 'Documents').FullName -Destination $UserBkpPath -Force -Recurse # 单独复制Documents目录,排除三个连接点 Copy-Item -Path (Get-Item -Path "$UserProfPath\Documents\*" -Exclude 'My Music', 'My Pictures', 'My Videos').FullName -Destination "$UserBkpPath\Documents" -Force -Recurse # 确保Documents目录存在(如果原Documents为空的话) if (-not (Test-Path "$UserBkpPath\Documents")) { New-Item -Path "$UserBkpPath\Documents" -ItemType Directory -Force | Out-Null }
方式2:复制完成后清理空文件夹
保留原复制逻辑,在复制结束后删除 Documents 下的冗余空文件夹:
$UserProfPath = "C:\Users\" + $UserID $UserProfPathAllItems = $UserProfPath + "\*" $UserBkpPath = $BackupLocation + "\" + $UserID Copy-Item -Path (Get-Item -Path $UserProfPathAllItems -Exclude 'Appdata').FullName -Destination $UserBkpPath -Force -Recurse # 清理Documents下的三个空冗余文件夹 $redunFolders = @("My Music", "My Pictures", "My Videos") foreach ($folder in $redunFolders) { $targetPath = Join-Path $UserBkpPath "Documents\$folder" if (Test-Path $targetPath) { # 确认是文件夹且为空 if ((Get-ChildItem $targetPath -Recurse -Force).Count -eq 0) { Remove-Item $targetPath -Force -Recurse } } }
内容的提问来源于stack exchange,提问作者Scy Watcher
相关产品推荐
相关产品推荐

