PowerShell复制时如何排除当前及子目录指定文件与文件夹?
修正PowerShell递归复制并排除目录/文件的代码
原代码的问题在于Copy-Item的-Exclude参数仅对源路径下的直接子项生效,递归遍历子目录时不会自动将排除规则应用到深层的文件和文件夹。要实现全局(当前目录+所有子目录)的排除,需要先通过Get-ChildItem筛选出符合要求的内容,再传递给Copy-Item执行复制。
修正后的代码
$exclude = @( "AppData", "Application Data", "Contacts", "Cookies", "IntelGraphicsProfiles", "Local Settings", "LtcJobs", "NetHood", "PrintHood", "Recent", "SendTo", "Searches", "главное меню", "Мои документы", "Мои видеозаписи", "мои рисунки", "Моя музыка", "Music", "MicrosoftEdgeBackups", "Saved Games", "Links", "Шаблоны", "All Users", "Default", "Default User", "Все пользователи", "LocAdmin", "*_wa", "*_adm", "*cache*", "*Cache*", "ntuser*", "Ntuser*", "NTUSER*", "*.tmp", "*.temp", "~*", "*.bak", "*.ini" ); # 先获取源目录下所有需要保留的项(递归排除指定内容) Get-ChildItem -Path "${from}Users\" -Exclude $exclude -Recurse -Force | # 逐个复制到目标路径,保留目录结构 Copy-Item -Destination { Join-Path $destinationFolderPath\Users $_.FullName.Substring($from.Length + 5) } -Force -PassThru *>&1 | Tee-Object -FilePath $pathToLogFile -Append;
关键说明
Get-ChildItem -Recurse -Exclude $exclude:递归遍历源目录,在遍历过程中直接排除所有匹配规则的文件和文件夹,确保后续复制的都是需要保留的内容。Join-Path $destinationFolderPath\Users $_.FullName.Substring($from.Length + 5):通过截取源路径的相对部分,保证复制到目标目录时保持原有的目录结构($from.Length +5是去掉${from}Users\的前缀长度,若$from末尾带反斜杠,需调整偏移量避免路径拼接出错)。-Force:确保覆盖目标目录已存在的文件/文件夹,同时复制隐藏、系统属性的项。- 日志部分保留原逻辑,将执行输出追加到指定日志文件。
额外注意事项
- 若
$from路径格式不确定,可先用[System.IO.Path]::GetFullPath("${from}Users\")标准化路径,再计算相对路径的截取长度,避免因路径格式差异导致拼接错误。 - Windows系统默认不区分文件名大小写,
*cache*这类通配符会同时匹配大小写不同的目标(如Cache、cache)。
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

