批处理文件 - 删除名称与此正则表达式匹配的文件或正则表达式但不是该正则表达式的文件

时间:2015-02-25 21:04:38

标签: regex windows batch-file dos

我尝试编写一个Windows批处理文件来删除匹配的目录中的所有文件({regex1 regex2而不是 { {1}})。

我可以使用以下内容删除与正则表达式匹配的文件:

regex3

但我不知道如何说:

  1. 这个正则表达式这个。
  2. 这个
  3. ~~~

    更新

    我尝试做的更好的例子:

    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$

    然后它会起作用。

    有什么想法吗?

1 个答案:

答案 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"