我使用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.b
,a.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/