如何修改PowerShell脚本以移动文件名含共同8位数字序列的文件
实现方案
该需求完全可以实现,只需将原脚本中取文件名前8位字符的逻辑替换为提取文件名中任意位置的连续8位数字序列即可,修改后的脚本及说明如下:
修改后可直接运行的脚本
$destination_folder = "C:\TEMP\DESTINATION" # 自动创建不存在的目标目录 if (-not (Test-Path -Path $destination_folder -PathType Container)) { New-Item -Path $destination_folder -ItemType Directory -Force | Out-Null } $filelist = Get-ChildItem -Path "C:\TEMP\ORIGIN" -File -Force -Recurse $filelist | Group-Object -Property { # 正则匹配文件名(不含后缀)中任意位置的连续8位数字 $match = [regex]::Match($_.BaseName, '\d{8}') return $match.Success ? $match.Value : $null } | Where-Object { # 过滤无匹配数字序列、以及仅单文件的分组 $null -ne $_.Name -and $_.Count -ge 2 } | ForEach-Object { # 移动匹配到的所有文件,-Force参数表示重名时直接覆盖 $_.Group | Move-Item -Destination $destination_folder -Force }
关键调整说明
- 用正则表达式
\d{8}匹配任意位置的连续8位数字,替代了原脚本固定取前8位字符的逻辑 - 新增了目标目录自动创建的逻辑,避免目标路径不存在时报错
- 自动过滤了文件名中不存在8位连续数字的文件,不会参与后续分组移动逻辑
可选调整项
- 若需要匹配包含后缀的完整文件名中的8位数字,将
$_.BaseName替换为$_.Name即可 - 若不需要重名覆盖,删除
Move-Item后的-Force参数即可 - 建议正式执行前先将
Move-Item -Destination $destination_folder -Force替换为Select-Object FullName,预览待移动的文件列表,确认无误后再执行移动操作
内容的提问来源于stack exchange,提问作者Andrea Morresi
相关产品推荐
相关产品推荐

