基于前缀将PDF文件移至对应目录的PowerShell脚本需求
PowerShell脚本实现PDF文件按规则分类移动
需求说明
当前目录存在一批PDF文件,命名格式示例如下:
PLA_01005_A.pdf PLA_09003_A.pdf PLA_11234_B.pdf PLA_16555_A.pdf ... PCA_02222_C.pdf PCA_05555_A.pdf PCA_06666_A.pdf ...
需要将这些文件移动到V盘已有的目录结构中,目标目录示例:
V:\PLA\PLA_01\ V:\PLA\PLA_02\ ... V:\PLA\PLA_16\ V:\PCA\PCA_01\ V:\PCA\PCA_02\ ... V:\PCA\PCA_06\
核心要求:
- 提取文件名前3个字符作为一级目录名(如
PLA、PCA) - 提取文件名前5个字符作为子目录名(如
PLA_01、PCA_02) - 移动时无提示覆盖现有文件
- 实现两种处理逻辑:
- 变体1:目标目录不存在则保留文件在原目录
- 变体2:目标目录不存在则创建目录后移动文件
用户尝试的代码:
$pla = @(1..17 | % tostring PLA_00*) #$pla2 = @("PLA\\"+$pla) $pla2 = @(1..17 | % tostring V:\\_pdf\\PLA\\PLA_00) $dest = "V:\_pdf\$($dest)" Get-ChildItem -Recurse -Include *.pdf -Filter '$pla' | Move-Item -Force -Verbose -Destination '$pla2'
解决方案
变体1:目标目录不存在则保留原文件
# 获取当前目录下所有PDF文件 Get-ChildItem -Path . -Filter *.pdf -File | ForEach-Object { # 提取一级目录名(前3个字符) $topDir = $_.Name.Substring(0, 3) # 提取子目录名(前5个字符) $subDir = $_.Name.Substring(0, 5) # 拼接完整目标路径 $targetPath = Join-Path -Path "V:\$topDir" -ChildPath $subDir # 检查目标目录是否存在 if (Test-Path -Path $targetPath -PathType Container) { # 目录存在则移动文件,-Force实现无提示覆盖 Move-Item -Path $_.FullName -Destination $targetPath -Force -Verbose } # 目录不存在则不做处理,文件保留在原目录 }
变体2:目标目录不存在则创建后移动文件
# 获取当前目录下所有PDF文件 Get-ChildItem -Path . -Filter *.pdf -File | ForEach-Object { # 提取一级目录名(前3个字符) $topDir = $_.Name.Substring(0, 3) # 提取子目录名(前5个字符) $subDir = $_.Name.Substring(0, 5) # 拼接完整目标路径 $targetPath = Join-Path -Path "V:\$topDir" -ChildPath $subDir # 确保目标目录存在(不存在则创建) if (-not (Test-Path -Path $targetPath -PathType Container)) { New-Item -Path $targetPath -ItemType Directory -Force | Out-Null } # 移动文件,-Force实现无提示覆盖 Move-Item -Path $_.FullName -Destination $targetPath -Force -Verbose }
代码说明
- 使用
Get-ChildItem精准获取当前目录下的PDF文件(-File只取文件,避免目录干扰) - 通过
Substring提取文件名指定长度的字符作为目录名,适配所有符合命名规则的文件 Join-Path安全拼接路径,避免手动拼接出现的格式问题-Force参数实现移动时无提示覆盖现有文件,同时在New-Item中用于创建多级目录(如果需要)- 变体1通过
Test-Path判断目录存在才移动;变体2自动创建缺失的目录后移动
内容的提问来源于stack exchange,提问作者Ju Tutt
相关产品推荐
相关产品推荐

