我的文件具有以下语法:
LWD_???_??????_???_??_??_LP?_??_?_*.PDF
例子:
LWD_ARC_G10000_102_UE_XX_LP5_08_E_Uebersicht_Bodenplatten
我想从文件名中提取子字符串,然后将文件放入具有基于该文件名的路径的文件夹中,如下所示:
C:\Lp5\ARC\G10\
第一个文件夹是文件名的第七部分,第二部分是第二个文件夹,第三部分的前三个字符是最后一个文件夹。
然后除此以外,我还需要进行其他删除:将文件复制到特定文件夹时,文件名中有一个连续编号的部分。我需要删除“较旧”文件,以便此文件夹中仅“最后”文件。数字/索引始终是第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实用程序-混合JScript /批处理脚本,可以有效地执行复杂的正则表达式替换。JREPL.BAT是纯脚本,可以从XP开始在任何Windows计算机上本地运行。
以下未经测试
无损版本
@echo off
for /f "tokens=1,2,3 delims=|" %%A in (
'dir /b /a-d LWD_*.PDF ^| jrepl "^(LWD_(...)_(...)..._..._.._.._(LP.)_)..(_._.*\.PDF)$" "$1??$5|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)$" "$1??$5|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"
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句