求PowerShell脚本:按指定名称筛选复制子文件夹
PowerShell脚本:批量复制指定子文件夹并保留目录结构
原代码问题分析
你当前的脚本缺少两个核心逻辑:
- 没有筛选出每个客户文件夹下的
Proposals子文件夹,而是直接复制了整个客户目录 - 目标路径没有保留
客户名称\Proposals的层级结构,所有内容会被直接放到目标根目录下
修正后的脚本
以下脚本会遍历指定源路径下的所有客户文件夹,仅复制其中存在的Proposals子文件夹,并在目标路径中保留原有的目录结构:
# 配置源路径和目标根路径 $sourceRoot = "C:\Clients" $targetRoot = "C:\Test\Clients" # 获取源路径下的所有一级客户文件夹(仅文件夹,排除文件) $clientFolders = Get-ChildItem -Path $sourceRoot -Directory foreach ($clientFolder in $clientFolders) { # 构造当前客户的Proposals文件夹完整路径 $proposalSource = Join-Path -Path $clientFolder.FullName -ChildPath "Proposals" # 先检查Proposals文件夹是否存在,避免无效复制 if (Test-Path -Path $proposalSource -PathType Container) { # 构造目标路径,保留客户名称层级:C:\Test\Clients\客户名\Proposals $proposalTarget = Join-Path -Path $targetRoot -ChildPath "$($clientFolder.Name)\Proposals" # 复制文件夹及所有内容,-Force可覆盖已存在的目标(按需启用) Copy-Item -Path $proposalSource -Destination $proposalTarget -Recurse -Force Write-Host "完成复制: $proposalSource -> $proposalTarget" } else { Write-Host "跳过: 未找到$($clientFolder.Name)下的Proposals文件夹" } }
关键逻辑说明
Get-ChildItem -Directory:仅获取源路径下的一级子文件夹(即客户文件夹),不会遍历深层目录Join-Path:安全拼接路径字符串,避免手动拼接时出现的路径分隔符错误Test-Path:提前验证Proposals文件夹是否存在,跳过无效的复制操作- 目录结构保留:通过
$clientFolder.Name在目标路径中重建客户名称层级,确保最终路径符合C:\Test\Clients\*Clientname\Proposals的要求
内容的提问来源于stack exchange,提问作者Eden Hamami
相关产品推荐
相关产品推荐

