Batch file 如何删除只有4个字符的文件?
我使用Windows 7,我想用构建一个批处理文件来完成以下任务: 删除Batch file 如何删除只有4个字符的文件?,batch-file,batch-processing,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\????.* ?代表任何字符(或有时根本没有字符,见下文) *表示
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\????.*
代表任何字符(或有时根本没有字符,见下文)?
表示任何字符序列*
?
仅代表一个字符
根据@dbenham的评论,我发现在更高版本的Windows中,?
代表0或1个字符
那么胖的短名字呢?
现在让我们来看看棘手的部分:带前导点的名称(即第一个点前0个字符)怎么样?有多个点的文件呢
在执行任何操作之前都会去除尾随点,因此abc.def….
的扩展名是def
,其基础是abc
点在短名称中位于固定位置,即使对于没有扩展名的文件也存在。这就是为什么*.*.
匹配所有文件,即使是没有扩展名的文件
前导点、多个点、超过3个字符的扩展名和超过8个字符的基(在点之前)部分在短FAT名称(也称为DOS名称)中无效,因此长名称(显示在Windows下)为其中之一的文件将具有一个虚构的短名称,看起来像POBASE~N.POE
,其中:
是base的一部分(通常是开头,去掉不寻常的字符)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
dir???.*
时,将匹配以下文件:
,长名称AB~1
。AB
,长名称AB~1.C
a.b.C
,长名称AB~2
。AB
C:\PROGRA~1
,您将进入(不成熟的本地化版本)C:\Program files
,如果插入一个胖格式的USB密钥,这些文件将有简短的名称。我不确定通配符是否会与这些短名称匹配,但以下是一些有趣的事实,表明它甚至不值得研究:
有趣的事实
- 在法语版本的Windows 7中,
将在资源管理器中显示为C:\Program files
,但如果尝试C:\Programs
,它将失败,因此命令行似乎不会使用翻译后的名称cd C:\Programs
- 在相同的Windows 7上,
(8.1个问号)将与???
(仅5个字符)匹配,但任何较短的内容(如a.b.c
,带有7.1个问号)都不匹配???
- 在相同的Windows 7上,
将匹配???
,尽管foo
中没有点foo
如果“!n:~3,1!”neq“echo del”%%F”
,它几乎和其他版本一样糟糕
如果windows没有三层文件命名(粗短名称、“实际”文件名和翻译文件名),如果他们没有选择更改?
的含义,那么所有这些都会简单得多
叹气这将删除任何名称为4个字符(不包括扩展名)且具有任何扩展名的文件。
e、 g.:
del4chrs“C:\DATA\Junk文件夹”
我相信这是删除所有文件的最简单的解决方案,这些文件的基本名称忽略扩展名正好是4个字符:EDIT-我从DIR命令中删除了掩码,因为FINDSTR正在进行真正的过滤 很容易修改解决方案,只删除由4个数字组成的文件(不考虑扩展名)
很好。谢谢乔治。当一个答案适合你的时候,别忘了接受它(用表格左边的勾号)
@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"
)
for /f "eol=: delims=" %%F in ('dir /b /a-d^|findstr /rx "....\.[^.]* ...."') do del "%%F"
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"