使用正则表达式根据文件名移动文件,并删除文件名中子字符串中编号较小的文件

Move files based on filename with regex and delete files with lower number in a substring in the filename

我有以下语法的文件:

LWD_???_??????_???_??_??_LP?_??_?_*.PDF

示例:

LWD_ARC_G10000_102_UE_XX_LP5_08_E_Uebersicht_Bodenplatten

我想从文件名中提取子字符串并将文件放入一个文件夹中,路径基于该文件名,如下所示:

C:\Lp5\ARC\G10\

第一个文件夹是文件名的第7部分,第二部分是第二个文件夹,第三部分的前3个字符是最后一个文件夹。

然后除此之外我还需要一个额外的删除:当文件被复制到特定文件夹时,文件名中有一个连续编号的部分。我需要删除 "older" 文件,以便此文件夹中只有 "last" 文件。 numbers/index 始终是第 30 个和第 31 个字符。

LWD_FEU_L20000_005_IZ_00_LP8_XX_F.pdf      Index 00
LWD_FEU_L20000_005_IZ_00_LP8_01_F.pdf      Index 01 

目前我只有一批静态文件夹:

FOR /R "E:\Downloads" %%i in (LWD_ELT_A10?00_???_??_??_LP5*) do move "%%i" "C:\Lp5\ELT\A10"
FOR /R "E:\Downloads" %%i in (LWD_???_A10000_???_??_??_LP5*) do del "%%i"
...

有没有人知道如何在没有 VBS 或其他的情况下做到这一点。像那样 - 只有 Windows Batch 或 PowerShell?

我的批处理策略如下:

1) 使用 DIR /B 获取 PDF 文件列表

2) 将每个文件名解析为由(竖线分隔)组成的字符串

  • 名称与 ?? 位置 30,31
  • 通配符匹配的文件掩码
  • 目标路径
  • 完整文件名

3) 对字符串进行降序排序,使最新版本位于每个文件名分组的顶部。

4) 使用 FOR /F 处理输出,解析出文件掩码、目标路径和全名

5) 对于每次迭代,如果目标文件夹不存在则创建目标文件夹,然后如果尚不存在与文件掩码匹配的文件,则有条件地将文件复制到目标。

以上策略是非破坏性的,因为原始文件都保留在原处。您可以将第 5 步修改为破坏性的 - 移动最新文件而不是复制文件,并删除其余文件。

您可以使用纯批处理相当轻松地实施上述策略。但我会使用我的 REPL.BAT utility - 一个混合的 JScript/batch 脚本,可以有效地执行复杂的正则表达式替换。 JREPL.BAT 是纯脚本,可​​以在任何 Windows XP 以后的机器上本地运行。

以下未经测试

无损版

@echo off
for /f "tokens=1,2,3 delims=|" %%A in (
  'dir /b /a-d LWD_*.PDF ^| jrepl "^(LWD_(...)_(...)..._..._.._.._(LP.)_)..(_._.*\.PDF)$" "??|c:$4$2$3|$&" /i /a ^| sort /r'
) do (
  md "%%B" >nul 2>nul
  if not exist "%%B\%%A" copy "%%C" "%%B" >nul
)

破坏版

@echo off
for /f "tokens=1,2,3 delims=|" %%A in (
  'dir /b /a-d LWD_*.PDF ^| jrepl "^(LWD_(...)_(...)..._..._.._.._(LP.)_)..(_._.*\.PDF)$" "??|c:$4$2$3|$&" /i /a ^| sort /r'
) do (
  md "%%B" >nul 2>nul
  if not exist "%%B\%%A" (move "%%C" "%%B" >nul) else del "%%C"
)