我使用 Windows 7,我想构建一个批处理文件来完成以下任务:
C:\images删除目录中名称为4个字符的所有文件。例如 1234.jpg 7123.jpg、8923.jpg、7812.jpg、1245.jpg、0067.jpg、0001.jpg、0010.jpg、0060.jpg 等。
那可能吗?
我使用 Windows 7,我想构建一个批处理文件来完成以下任务:
C:\images删除目录中名称为4个字符的所有文件。例如 1234.jpg 7123.jpg、8923.jpg、7812.jpg、1245.jpg、0067.jpg、0001.jpg、0010.jpg、0060.jpg 等。
那可能吗?
此解决方案将删除所有在点之前的名称部分有 4 个字符的文件,以及可能在点之前有较短部分的文件。
ERASE C:\images\????.*
?代表任何字符(或有时根本没有字符,见下文)*代表任何字符序列。在 Windows 98 下(我有一种直觉,这对于不完全支持长 FAT 名称的“纯”DOS 版本也有效,包括 win95 和更早版本,可能还有 Windows Millennium),?仅代表一个字符。
根据@dbenham 的评论,我知道在更高版本的 Windows 中,它?代表 0 或 1 个字符。
现在是棘手的部分:带有前导点的名称(即第一个点之前的 0 个字符)呢?带有多个点的文件呢?
在执行任何操作之前,尾随点被剥离,因此扩展abc.def.....是def,其基是abc。
点位于短名称中的固定位置,即使对于没有扩展名的文件也存在。这就是*.*匹配所有文件的原因,即使是那些没有扩展名的文件。
前导点、多个点、超过 3 个字符的扩展和超过 8 个字符的基本(点之前)部分在短 FAT 名称(也称为 DOS 名称)中无效,因此长名称(在 Windows 下显示)的文件是其中一个将有一个虚构的短名称,看起来像POBASE~N.POE,其中:
POBASE是基础的一部分(通常是开头,去掉了不寻常的字符),~是一个文字波浪字符,N是一个或多个数字,通常是与现有名称不冲突的最小数字,POE是扩展名的一部分(通常是开头,去掉不寻常的字符),其中扩展名是最后一个点之后的部分,我按顺序创建了以下文件:
.ab有简称AB~1a.b.c有简称AB~1.Ca.bcde有简称A~1.BCDa.x y(注意空格)有简称a.xy..ab有短名称AB~2,因为AB~1已经存在(第一个示例)a.b, a.b., a.b..,a.b...都是同一个文件的等价名称(即如果存在,创建a.b...将覆盖)。a.b在旧的 Windows 98 系统上运行命令dir ????.*时,将匹配以下文件:
AB~1, 名字长.abAB~1.C, 名字长a.b.cAB~2, 名字长..ab现在,虽然 Vista 和 7 已尝试将大多数 DOS 遗留系统扔出窗口(双关语),但仍有一些残余:如果您C:\PROGRA~1在资源管理器窗口的地址栏中键入,您将进入(半生不熟的) 的本地化变体C:\Program files,如果您插入 FAT 格式的 USB 密钥,文件将具有短名称。我不确定通配符是否会与这些短名称匹配,但这里有一些“有趣”的事实,表明它甚至不值得研究:
C:\Program files将在资源管理器中显示为C:\Programmes,但如果您尝试cd C:\Programmes,它将失败,因此命令行似乎不使用翻译后的名称。????????.?(8.1 问号)将匹配a.b.c(只有 5 个字符),但任何更短的内容(如???????.?7.1 问号)都不会匹配。????????.?将匹配foo,尽管foo.总而言之,如果您想编写一个可靠地删除第一个(或最后一个)点之前正好四个字符的文件的程序,请使用其他一些解决方案,不要使用通配符。
但是,请注意,旧的 Windows 版本不具备所有那些花哨的脚本功能来获取具有笨拙语法的字符串的长度(我的意思是,说真的,它几乎和zsh globbing modifiersif "!n:~3,1!" neq "" echo del "%%F"一样糟糕。
如果 Windows 没有三层文件命名(FAT 短名称、“实际”文件名和翻译文件名),并且没有选择更改?.
叹
这将删除名称正好为 4 个字符(不包括扩展名)和任何扩展名的任何文件。
例如:del4chrs "C:\DATA\Junk Folder"
@echo off
setlocal enabledelayedexpansion
if "%1" == "" (
echo Usage del4chrs {folder}
goto :eof
)
if not exist "%~1\nul" (
echo Folder not found.
goto :eof
)
pushd "%~1"
for %%F in (????.*) do (
set n=%%~nF
if "!n:~3,1!" neq "" echo del "%%F"
)
我相信这是删除所有文件的最简单的解决方案,其基本名称无视扩展名正好是 4 个字符:编辑 - 我从 DIR 命令中删除了掩码,因为 FINDSTR 无论如何都在进行真正的过滤
for /f "eol=: delims=" %%F in ('dir /b /a-d^|findstr /rx "....\.[^.]* ...."') do del "%%F"
很容易修改解决方案,只删除由 4 个数字组成的文件(不考虑扩展名)
for /f "eol=: delims=" %%F in ('dir /b /a-d^|findstr /rx "[0-9][0-9][0-9][0-9]\.[^.]* [0-9][0-9][0-9][0-9]"') do del "%%F"