使用正则表达式根据文件名移动文件,并删除文件名中子字符串中编号较小的文件
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"
)
我有以下语法的文件:
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"
)