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

Batch file - Deleting files with a name matching this regex OR that regex but NOT that one

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

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

for /f "tokens=*" %%a in (
    'dir /a-d /b *.* ^| findstr /r /c:"^test[0-9]*.jar$"'
) do del "%%a"

但我不知道怎么说:

  1. 这个正则表达式这个。
  2. 不是这个

~~~

更新

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

.bat 文件将在 7-zip's SFX(自解压)可执行文件解压结束时自动 运行。此可执行文件将更新文件夹结构中的一些版本控制的 jar。

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

...必须删除。

但是那些必须不能被删除:

我目前无法在 .bat 中仅使用 one 正则表达式来表达这一点,因为 findstr 的正则表达式功能非常有限。但如果我能说:

任何东西 :

...必须删除 except :

那就可以了。

有什么想法吗?

如果您想保留最新版本,那么我认为您会希望保留 test-1.0.3.jar,而不是 test-1.0.2.jar。但我假设你知道自己在做什么。

使用我的 JREN.BAT hybrid JScript/batch utility 很容易解决这个问题。 JREN.BAT 是纯脚本,可​​以在任何 Windows XP 以后的机器上本地运行。

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"