如何只用一行删除目录中的所有文件?

时间:2018-10-31 11:15:36

标签: batch-file

我正在尝试编写一个批处理文件,该文件允许我删除仅包含一行的特定文件夹中的所有文件。我可以计算行数,但是我不能用它来删除那些文件。

可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我认为,您需要这样的批处理文件:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir "C:\Temp\*" /A-D-H /B 2^>nul') do call :DeleteFile "C:\Temp\%%I"
endlocal
goto :EOF

:DeleteFile
for /F "usebackq skip=1 eol=" %%J in (%1) do goto :EOF
del /F %1
goto :EOF

第一个 FOR 在以cmd.exe /C开头的单独命令过程中在后台命令行中执行

dir "C:\Temp\*" /A-D-H /B 2>nul

命令 DIR 列出了单独命令过程的 STDOUT

  • 由于C:\Temp
  • ,指定目录/A-D-H中所有非隐藏文件的文件名
  • 由于/B而以纯格式显示,仅具有文件名和文件扩展名
  • 匹配简单的通配符模式*

DIR 将错误消息输出到 STDERR ,并用2>nul重定向到设备 NUL ,以在找不到目录条目时禁止显示该错误消息符合这些要求。

阅读有关Using Command Redirection Operators的Microsoft文章,以获取2>nul的解释。当Windows命令解释器在执行命令之前处理此命令行时,重定向操作符>必须在 FOR 命令行上使用脱字符号^进行转义,才能被解释为文字字符。 FOR ,它将在后台启动的单独命令进程中执行嵌入式dir命令行。

FOR 捕获所有输出到单独命令过程的 STDOUT 并逐行处理捕获的文本。

空行被 FOR 忽略,此处不会出现,除非 DIR 未找到匹配的文件名。

FOR 在使用/F时默认忽略所有以分号开头的行。没有路径的文件名可以以;开头,因此eol=|用于将行尾重新定义为文件名不能包含的竖线。

FOR 默认情况下使用空格/制表符将行分隔为子字符串(令牌),并仅将第一个空格/制表符分隔的字符串分配给指定的循环变量Idelims=禁用了行拆分行为,该行定义了一个空的定界符列表。

因此,将整个文件名分配给循环变量I,该变量与指定的文件夹路径连接在一起,成为完整的合格文件名,并传递给子例程DeleteFile

子例程DeleteFile中的命令 FOR 处理文件中的行,该文件中的全限定文件名用双引号引起来。

需要 FOR 选项usebackq,因为双引号中的完整合格文件名不应解释为要由 FOR 处理的字符串,而应解释为文件 FOR 应处理的行的名称。

FOR 选项skip=1用于始终跳过指定文件的第一行。

FOR 选项eol=没有定义行尾字符,这是避免 FOR 忽略以;开头的行所必需的

默认情况下,普通空间和水平制表符保留为定界符。

因此 FOR 打开文件并跳过第一行,而与该行包含的内容无关。然后,它通过跳过空行和仅包含空格/制表符的行来处理其余行。在包含非常规空格或水平制表符的第一行之后的行中,执行命令goto :EOF,导致退出 FOR 循环和子程序DeleteFile

因此,仅当文件完全不包含任何行,或仅包含一行或不包含一行时,才执行 FOR 循环后的命令 DEL 顶部,下面仅是多个空行或空行。

删除文件后,退出子例程,并在第一个 FOR 中使用下一个文件名继续执行批处理文件。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • call /?
  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • setlocal /?

另请参阅Where does GOTO :EOF return to?