PowerShell批量提取.msg文件按工号文件夹分类存储问题求助
PowerShell 按工号分类拷贝.msg文件解决方案
原有脚本问题定位
- 构建目标路径时使用的
$Name变量未提前赋值,导致路径拼接逻辑失效,所有文件直接写入目标根目录 - 未正确提取每个
.msg文件对应的工号目录名称(源路径下第一级子目录为工号命名) - 重复文件处理逻辑被注释,实际运行时重名文件会被直接覆盖,存在数据丢失风险
修正后可直接运行的脚本
# 配置源路径和目标路径(结尾不要加反斜杠) $source = "C:\Users\damia\OneDrive\Desktop\b" $dest = "C:\Users\damia\OneDrive\Desktop\a" # 递归检索所有.msg文件,内置筛选效率更高适配大数据量场景 $msgFiles = Get-ChildItem -Path $source -Recurse -File -Filter "*.msg" $msgFiles | ForEach-Object { # 提取对应工号:取文件相对源路径的第一级目录名即为工号 $relativePath = $_.FullName.Substring($source.Length).TrimStart('\') $jobNumber = $relativePath.Split('\')[0] # 自动创建目标路径下的工号文件夹 $targetDir = Join-Path -Path $dest -ChildPath $jobNumber if (-not (Test-Path -Path $targetDir)) { New-Item -ItemType Directory -Path $targetDir | Out-Null } # 处理重名文件,自动添加序号后缀避免覆盖 $targetFileName = $_.Name $targetFilePath = Join-Path -Path $targetDir -ChildPath $targetFileName $i = 1 while (Test-Path -Path $targetFilePath) { $targetFileName = "{0}({1}){2}" -f $_.BaseName, $i, $_.Extension $targetFilePath = Join-Path -Path $targetDir -ChildPath $targetFileName $i++ } # 执行文件拷贝 Copy-Item -Path $_.FullName -Destination $targetFilePath -Force }
功能说明
- 自动识别每个
.msg文件对应的工号,在目标路径下自动创建对应工号文件夹,最终和源端的2万个工号目录一一对应 - 内置重名文件兼容逻辑,同一工号下如果存在同名
.msg文件,会自动添加序号后缀,不会出现覆盖丢失数据的问题 - 检索逻辑优化,比原脚本遍历效率更高,适配2万+目录的大数据量运行场景
内容的提问来源于stack exchange,提问作者Damian
相关产品推荐
相关产品推荐

