我尝试编写一个Windows批处理文件来删除匹配的目录中的所有文件({regex1
或 regex2
)而不是 { {1}})。
我可以使用以下内容删除与正则表达式匹配的文件:
regex3
但我不知道如何说:
~~~
更新
我尝试做的更好的例子:
for /f "tokens=*" %%a in (
'dir /a-d /b *.* ^| findstr /r /c:"^test[0-9]*.jar$"'
) do del "%%a"
文件将在提取7-zip's SFX(自解压)可执行文件时自动运行。此可执行文件将更新文件夹结构中的某些版本化jar。
我们假设可执行文件将在.bat
文件夹中提取test-1.0.2.jar
文件。如果这个确切的文件(相同版本)已经存在,那么它将被覆盖,这已经很好用,因为它由SFX可执行文件本身管理。但是如果lib
文件夹中已存在同一文件的其他版本,我希望.bat文件删除它们!例如:
lib
test-1.0.1.jar
test-1.0.3.jar
test-1.0.jar
test-1.jar
...必须删除。
但那些不必须删除:
test.jar
(新文件本身)test-1.0.2.jar
(不是同一档案的版本)我目前无法在.bat中仅使用一个正则表达式来表达,因为test-test2-1.0.0.jar
的正则表达式功能非常有限。但如果我能够说:
任何事情:
findstr
或^test.jar$
或^test-[0-9]+.jar$
或^test-[0-9]+.[0-9]+.jar$
...必须删除,:
除外^test-[0-9]+.[0-9]+.[0-9]+.jar$
然后它会起作用。
有什么想法吗?
答案 0 :(得分:1)
如果你想保留最新的版本,那么我认为你想要保留test-1.0.3.jar,而不是test-1.0.2.jar。但我会假设你知道你在做什么。
使用我的JREN.BAT hybrid JScript/batch utility可轻松解决此问题。 JREN.BAT是纯脚本,可以在XP以后的任何Windows机器上本机运行。
JREN.BAT实际上是通过正则表达式替换来重命名文件(或文件夹)。但是有一个/ LIST选项只是简单地列出结果,而不实际重命名任何东西。 / RFM选项指定正则表达式文件掩码以确定要包含哪些文件。 / FX选项用于指定排除列表。
从命令行:
for /f "delims=" %F in ('jren "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$"') do del "%F"
或在批处理脚本中:
@echo off
for /f "delims=" %%F in (
'jren "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$"'
) do del "%%F"
更新以回复评论
要从"%dp0lib"
删除文件(请参阅OP的评论),您可以使用(请注意%dp0
已经以\
结尾):
@echo off
for /f "delims=" %%F in (
'jren "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$" /p "%~dp0lib"'
) do del "%~dp0lib\%%F"
或
@echo off
pushd "%~dp0lib"
for /f "delims=" %%F in (
'jren "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$"'
) do del "%%F"
popd
当PATH未指向jren时支持路径中的空格的最终更新
@echo off
for /f "delims=" %%F in (
'^""%~dp0jren.bat" "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$" /p "%~dp0lib"^"'
) do del "%~dp0lib\%%F"