Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何删除只有4个字符的文件?_Batch File_Batch Processing - Fatal编程技术网

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

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\????.* ?代表任何字符(或有时根本没有字符,见下文) *表示

我使用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版本,其中包括win95和更早版本,可能还有Windows Millennium),
仅代表一个字符

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

那么胖的短名字呢? 现在让我们来看看棘手的部分:带前导点的名称(即第一个点前0个字符)怎么样?有多个点的文件呢

在执行任何操作之前都会去除尾随点,因此
abc.def….
的扩展名是
def
,其基础是
abc

点在短名称中位于固定位置,即使对于没有扩展名的文件也存在。这就是为什么
*.*.
匹配所有文件,即使是没有扩展名的文件

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

  • POBASE
    是base的一部分(通常是开头,去掉不寻常的字符)
  • ~
    是文字平铺字符
  • 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
,如果插入一个胖格式的USB密钥,这些文件将有简短的名称。我不确定通配符是否会与这些短名称匹配,但以下是一些有趣的事实,表明它甚至不值得研究:

有趣的事实
  • 在法语版本的Windows 7中,
    C:\Program files
    将在资源管理器中显示为
    C:\Programs
    ,但如果尝试
    cd C:\Programs
    ,它将失败,因此命令行似乎不会使用翻译后的名称
  • 在相同的Windows 7上,
    ???
    (8.1个问号)将与
    a.b.c
    (仅5个字符)匹配,但任何较短的内容(如
    ???
    ,带有7.1个问号)都不匹配
  • 在相同的Windows 7上,
    ???
    将匹配
    foo
    ,尽管
    foo
    中没有点
结论 总之,如果您想编写一个程序,可靠地删除第一个(或最后一个)点前正好有四个字符的文件,请使用其他一些解决方案,不要使用通配符

但是,请注意,较旧的windows版本没有所有那些奇特的dancy脚本功能来获取语法笨拙的字符串长度(我的意思是,严肃地说,
如果“!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"