批处理文件/Windows:删除文件扩展名为数字的文件

Batch File / Windows: Deleting Files with Number in File Extension

我想删除所有文件扩展名中包含数字的文件 - 在我的例子中,文件如下所示:

FileName.1
FileName.2
FileName.3
...

我(天真地)尝试了 del *.*[0-9]* 但(当然)没有运气。我正在使用 Windows 7 系统,但我没有管理员权限。

作为一个信息 - 这个问题与我在 Latex 论坛中的一个问题有关:https://tex.stackexchange.com/questions/310238


谢谢大家的回答。我很难说我应该接受哪个。

如果您愿意使用 PowerShell(Windows 7 附带),您可以使用正则表达式模式。一种长格式方法是:

Get-ChildItem "d:\folder\" | where { $_.Extension -match '[0-9]' } | Remove-Item -Whatif

(该模式将匹配包含数字的扩展名,或使用 '^\.\d+$' 匹配完全是数字而没有其他任何内容的扩展名。-WhatIf 标志使其无损,因此它告诉您它会删除什么,删除该标志以使其 运行 成为真实的)。

有几种方法可以将其写成简短形式,例如:

gci "d:\folder\" |? { $_.Extension -match '\d' } | rm

话虽如此,PowerShell 更好、更简单、更强大,但如果我必须使用批处理文件方法,它可能是:

@Echo Off

rem List all filenames into a temp file
dir /b > tmpFileList.txt

rem Isolate filenames which end in numbers into another temp file
findstr /R "\.[0-9][0-9]*$" tmpFileList.txt > tmpFileList2.txt

rem Run through the second temp file, and delete those filenames
for /f "delims=" %%L in (tmpFileList2.txt) do (
    del /P "%%L"
)

rem cleanup
rm tmpFileList.txt
rm tmpFileList2.txt

删除 /P 不提示删除。

您或许可以在没有一个或多个临时文件的情况下执行此操作,但这非常简单。但是,这只有在所有文件都在一个文件夹中并且您在同一个文件夹中时才有效。 (PowerShell 版本更容易处理子文件夹)。

[编辑:调整了 'for' 循环,使其可以处理名称中包含空格的文件]

我会这样做:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "FILEMASK=%~1"
for /F "eol=| delims=" %%F in ('
    dir /B /A:-D "%FILEMASK%" ^| findstr /R "\.[0-9][0-9]*$"
') do (
    del /P /F "%%~F"
)

endlocal
exit /B

要使用此批处理程序,请提供文件掩码作为参数。如果不给,则枚举当前目录。

del命令中添加了/P开关用于测试目的,因此如果您不希望出现任何提示,只需将其删除即可。 /F 开关强制删除只读文件;如果您不想要,也将其删除。


我上面说的文件掩码只针对dir命令,它只支持全局通配符*?,代表一个字符序列或一个单个字符,分别。另请参阅这篇 Microsoft 文章:Using wildcard characters.

没有直接的方法来构建仅匹配数字的掩码,也根据此:Command-prompt wildcards for digits?

因此,我正在使用 findstr 命令(它支持一小部分正则表达式)来过滤任何具有纯数字文件扩展名的文件。有关此有用命令的详细信息,请参阅 Microsoft 文章 Findstr and also site FINDSTR

此解决方案删除所有数字扩展名大于 0 的文件:

@echo off
setlocal EnableDelayedExpansion

for %%a in (*.*) do (
   set "ext=%%~Xa"
   set /A "ext=!ext:~1!"
   if !ext! neq 0 del "%%a"
)

要删除多个文件夹中的文件,只需将 /R 切换到 for 命令即可。