batch-file - 如何删除只有4个字符的文件?

标签 batch-file batch-processing

我使用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有哪些不同的版本?

在Windows 98下(我有一种直觉,这对于“纯” DOS版本也有效,而没有完全支持长FAT名称,包括WIN95和更早的版本,甚至Windows Millennium),?代表一个字符。

根据@dbenham的评论,我知道在更高版本的Windows中,?代表0或1个字符。

FAT短名称呢?

现在,对于棘手的部分:带有前导点的名称(即第一个点之前的0个字符)如何处理?带有多个点的文件呢?

在执行任何操作之前,尾部的点都被删除,因此abc.def.....的扩展名是def,其基数是abc

点在短名称中的固定位置,甚至对于不带扩展名的文件也存在。这就是*.*匹配所有文件的原因,即使没有扩展名的文件也是如此。

在短FAT名称(也称为DOS名称)中,前导点,多个点,超过3个字符的扩展名和超过8个字符的基部(点之前)无效,因此文件的长名称(在Windows下显示)为其中一个将具有虚构的短名称,类似于POBASE~N.POE,其中:


POBASE是基础的一部分(通常是开头,去除了不寻常的字符),
~是原义的波浪号字符,
N是一个或多个数字,通常是不与现有名称冲突的最小数字,
POE是扩展名的一部分(通常是开头,去除了不寻常的字符),其中扩展名是最后一个点之后的部分,
并且所有部分均为大写字母或数字。


我按以下顺序创建了以下文件:


.ab的简称AB~1
a.b.c的简称AB~1.C
a.bcde的简称A~1.BCD
a.x y(注意空格)的简称为a.xy
..ab的简称为AB~2,因为AB~1已经存在(第一个示例)
a.ba.b.a.b..a.b...是同一文件的所有等效名称(即,创建a.b...将覆盖a.b(如果存在))。


在旧的Windows 98系统上运行命令dir ????.*时,将匹配以下文件:


AB~1,长名称.ab
AB~1.C,长名称a.b.c
AB~2,长名称..ab


现在,虽然Vista和7试图将大多数DOS旧版本扔出窗口(双关语意),但仍有一些残留:如果在资源管理器窗口的地址栏中键入C:\PROGRA~1,您将进入( C:\Program files的半自动本地化变体,如果您插入FAT格式的USB密钥,则文件将具有短名称。我不确定通配符是否会与这些短名称匹配,但这是一些“有趣”的事实,表明甚至不值得调查:

有趣的事实


在法语版本的Windows 7中,C:\Program files将在资源管理器中显示为C:\Programmes,但是如果尝试使用cd C:\Programmes,它将失败,因此命令行似乎不使用翻译后的名称。 。
在同一Windows 7上,????????.?(8.1个问号)将与a.b.c(仅5个字符)匹配,但是任何较短的内容(例如带有7.1个问号的???????.?)将不匹配。
在同一Windows 7上,尽管????????.?中没有点,但foo将匹配foo


结论

总而言之,如果您要编写一个程序来可靠地删除文件中第一个(或最后一个)点前四个字符的文件,请使用其他一些解决方案,而不要使用通配符。

但是,请注意,较旧的Windows版本不具备使用笨拙的语法获取字符串长度的所有花式脚本功能(我是说,if "!n:~3,1!" neq "" echo del "%%F",它几乎与zsh globbing modifiers一样糟糕。

如果Windows没有三层文件命名(FAT短名称,“实际”文件名和翻译后的文件名),并且没有选择更改?的含义,那么所有这些操作将变得非常简单。 。

关于batch-file - 如何删除只有4个字符的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11972572/

相关文章:

windows - 在批处理文件中实现定时输入。 (倒计时一分钟)

powershell - 如何在 Power Shell 中正确增加不同月份的日期 ('yyyy-mm-dd')

spring - 避免在 Spring Batch 中处理同一文件两次

linux - 使用批处理脚本从Windows检查Linux服务器中的服务

batch-file - 错误级别的批处理选择命令不起作用

batch-file - 使用 wget 或 curl 从 Jenkins 下载工件

c# - SqlDataAdapter 在设置批处理大小时给出参数名称无效错误

linux - 使用 slurm 作业 ID

batch-file - 如何通过批处理脚本根据文件夹名称重命名文件

java - Spring Batch如何在写入步骤之前处理数据列表