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

Regex 批处理文件-删除名称与此正则表达式或该正则表达式匹配但与该正则表达式不匹配的文件,regex,windows,batch-file,dos,Regex,Windows,Batch File,Dos,我尝试编写一个Windows批处理文件来删除目录匹配中的所有文件(regex1或regex2),而不是regex3) 我可以使用以下方法删除与正则表达式匹配的文件: for /f "tokens=*" %%a in ( 'dir /a-d /b *.* ^| findstr /r /c:"^test[0-9]*.jar$"' ) do del "%%a" 但我不知道该怎么说: 这个正则表达式还是这个 但不是这个 ~~~ 更新 我正在尝试做的一个更好的例子: .bat文件将在(自解压)可

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

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

for /f "tokens=*" %%a in (
    'dir /a-d /b *.* ^| findstr /r /c:"^test[0-9]*.jar$"'
) do del "%%a"
但我不知道该怎么说:

  • 这个正则表达式还是这个
  • 但不是这个
  • ~~~

    更新

    我正在尝试做的一个更好的例子:

    .bat
    文件将在(自解压)可执行文件的解压结束时自动运行。此可执行文件将更新文件夹结构中的一些版本化JAR

    假设可执行文件将在
    lib
    文件夹中提取
    test-1.0.2.jar
    文件。如果这个完全相同的文件(相同的版本)已经存在,那么它就会被覆盖,因为它是由SFX可执行文件本身管理的,所以它已经工作得很好了。但是如果在
    lib
    文件夹中已经有相同文件的其他版本,我希望.bat文件删除它们!例如:

    • test-1.0.1.jar
    • test-1.0.3.jar
    • test-1.0.jar
    • test-1.jar
    • test.jar
    …必须删除

    但不得删除以下内容:

    • test-1.0.2.jar
      (新文件本身)
    • test-test2-1.0.0.jar
      (不是同一文件的版本)
    我目前无法在.bat中仅使用一个正则表达式来表达这一点,因为
    findstr
    的正则表达式功能非常有限。但如果我能说:

    任何:

    • ^test.jar$
    • ^test-[0-9]+.jar$
    • ^test-[0-9]+[0-9]+.jar$
    • ^test-[0-9]+[0-9]+[0-9]+.jar$
    。。。必须删除,以下情况除外:

    • test-1.0.2.jar
    那就行了


    有什么想法吗?

    如果您想保留最新版本,那么我认为您应该保留test-1.0.3.jar,而不是test-1.0.2.jar。但我想你知道你在做什么

    这是很容易解决使用我的。BAT是纯脚本,从XP开始在任何Windows机器上本机运行

    BAT实际上是通过正则表达式替换来重命名文件(或文件夹)。但是有一个/LIST选项,它只列出结果,而不实际重命名任何内容。/RFM选项指定一个regex文件掩码,以确定要包括哪些文件。/FX选项用于指定排除列表

    从命令行:

    for/f“delims=“%f in('jren“^”“”/list/fx“test-1.1.2.jar”/rfm“^test(?:-\d+(?:\.\d+)*)?\.jar$”)执行del“%f”
    
    或从批处理脚本中:

    @echo关闭
    对于/f“delims=”%%f in(
    “jren”^”“/list/fx“test-1.1.2.jar”/rfm“^test(?:-\d+(?:\.\d+*))?\.jar$”
    )删除“%%F”
    
    根据评论进行更新

    要从
    %dp0lib”
    中删除文件(请参阅OP的评论),您可以使用(注意
    %dp0
    已以
    \
    结尾):

    @echo关闭
    对于/f“delims=”%%f in(
    “jren”^”“/list/fx“test-1.1.2.jar”/rfm“^test(?:-\d+(?:\.\d+)*)?\.jar$”/p“%~dp0lib”
    )删除“%~dp0lib\%F”
    

    @echo关闭
    pushd“%~dp0lib”
    对于/f“delims=”%%f in(
    “jren”^”“/list/fx“test-1.1.2.jar”/rfm“^test(?:-\d+(?:\.\d+*))?\.jar$”
    )删除“%%F”
    邻苯二胺
    
    当路径不指向jren时支持路径中空格的最终更新

    @echo关闭
    对于/f“delims=”%%f in(
    “^”“%~dp0jren.bat”“^”“/list/fx”test-1.1.2.jar”/rfm“^test(?:-\d+(?:\.\d+*))?\.jar$”/p“%~dp0lib”^”
    )删除“%~dp0lib\%F”
    
    您能提供具体的测试数据吗?你试过什么了吗?@Stribizev我更新了我的问题,为我需要实现的目标提供了一个更好的例子。而且,没有,除了我已经发布的关于do的
    代码,我没有发现任何其他有用的东西!谢谢,这正是我需要的!另外:是的,我可能想删除文件的较新版本,因为如果在最新版本中发现问题,可执行文件可能会用于回滚到以前的版本。批处理脚本示例中最后一个“%%F”缺少“%”。除此之外,它工作得非常好。再次感谢@电类型-啊-我看到问题了。我假设您在路径中的某个地方有JREN.BAT,所以您可以简单地使用JREN运行它,而不管您当前的目录是什么。如果路径不指向JREN.BAT,则是,您需要指定路径。为了包含空格,必须用引号将路径括起来。如果使用引号,则必须包含.BAT扩展名
    “%~dp0lib\jren.bat”
    谢谢,但它对我不起作用。在
    test.bat
    文件中,在
    jren.bat
    旁边:
    for/f“delims=“%%%f In(“%~dp0jren.bat”“^”“”/list/rfm“^test$”)执行echo%%f
    。当这两个文件位于带有空格的路径中时,仍然会出现错误。@electrotype-ooh,我忘记了这个应用程序:。我提供了最后一个更新来解决这个问题。