将含前置唯一ID的PDF批量移动至对应后置唯一ID文件夹
问题分析与修正方案
原代码存在的问题
- 目标路径书写错误:
$TargetPath = 'C\:F\Individual Folders'里的冒号位置错误,正确格式应为C:\F\Individual Folders - 文件夹筛选逻辑错误:原Filter试图匹配以ID开头的文件夹,但实际需要匹配以
[ID]结尾的文件夹,且原Filter的括号语法不完整 - 缺少错误处理:如果找不到对应文件夹,执行
Move-Item会直接报错导致脚本中断
修正后的代码
$FilesToMove = 'C:\F\2024 Detailed Letters' $TargetPath = 'C:\F\Individual Folders' # 获取所有待移动的PDF文件 $Files = Get-ChildItem -Path $FilesToMove -Filter *.pdf -File foreach ($File in $Files) { # 提取文件名开头的8位唯一ID $uniqueId = $File.Basename.Substring(0, 8) # 筛选以"[uniqueId]"结尾的目标文件夹 $targetFolder = Get-ChildItem -Path $TargetPath -Directory -Filter "*[$uniqueId]" | Select-Object -First 1 if ($targetFolder) { $destinationPath = Join-Path -Path $targetFolder.FullName -ChildPath $File.Name Write-Output "移动文件: $($File.Name) -> $($targetFolder.Name)" Move-Item -Path $File.FullName -Destination $destinationPath -Force } else { Write-Warning "未找到对应文件夹,跳过文件: $($File.Name)" } }
关键修正点说明
- 路径修正:修正目标路径的冒号位置错误,确保路径合法可识别
- ID提取:通过
$File.Basename.Substring(0,8)准确提取文件名开头的8位ID(Basename自动去除.pdf后缀,避免后缀干扰ID提取) - 文件夹筛选:使用
*[$uniqueId]作为筛选规则,精准匹配格式为XXX_XXXX [unique ID]的文件夹(*匹配任意前缀,[$uniqueId]匹配结尾的ID部分) - 错误处理:增加
if ($targetFolder)判断,找不到对应文件夹时输出警告并跳过,保证脚本持续执行 - 路径拼接:用
Join-Path命令安全拼接目标路径,避免手动拼接字符串出现格式问题
内容的提问来源于stack exchange,提问作者rlu
相关产品推荐
相关产品推荐

