批处理脚本,用于打印与文件名称模式匹配的文件夹中的多个文件的最后一行

我有一个文件夹中的多个文本文件。 我想打印匹配文件名模式*.Config的文件夹中find的每个文件的最后一行,并将这些行redirect到一个新的文本文件。

下面的脚本适用于1个文本文件。 但目前我做了多个文本文件的循环, %lastline%打印总是相同的值。

 @echo off & setlocal EnableDelayedExpansion for /f %%i in ('dir /b *.Config') do ( for /r "delims==" %%a in (%%i) do ( set lastline=%%a echo %lastline% is the last line of %%i >> vResult.txt ) ) 

使用此批处理代码将当前目录中的vResult.txt文件vResult.txt当前目录中每个* .config文件的最后一行:

 @echo off setlocal EnableExtensions EnableDelayedExpansion del vResult.txt 2>nul for %%I in (*.config) do ( for /F "usebackq delims=" %%L in ("%%I") do set "LastLine=%%L" echo !LastLine! is the last line of %%I>>vResult.txt ) endlocal 

第二个FOR命令行所需的第一个命令扩展以及根据回显每个文件的最后一行所需的延迟环境变量扩展使用第二个命令行启用。 命令扩展默认启用,但不能延迟扩展。

然后,可能已经存在的vResult.txt被删除,同时通过命令DEL输出的错误信息来删除,以便在删除文件不存在的情况下通过将其重定向到设备NUL来处理STDERR

外部FOR在当前目录中搜索*.config文件,并且未设置隐藏属性。 除了需要查找隐藏的* .config文件之外,这里不需要使用命令DIR

内部FOR处理外部FOR循环找到的每个* .config文件的行。 通常建议将文件名用双引号括起来,并使用usebackq将双引号文件名解释为文件名,而不是以* .config文件中包含空格字符的字符串进行处理。 delims=禁止在空格/制表符上分割每一行以获得整行。

由于环境变量LastLine是在一个命令块中定义/修改的,所以有必要使用延迟扩展作为开始时使用感叹号而不是百分号来引用环境变量。

在执行外部FOR命令之前,所有用外部FOR的每次迭代执行的完整命令块的百分号引用的环境变量已被具有当前引用环境变量值的Windows命令解释器替换。 这导致您的批处理代码与ECHO命令行另外在错误的循环中,在第一次执行外部FOR之前将%lastline%替换%lastline%

要调试批处理文件,并在预处理命令行和命令块后查看Windows命令解释器的真实执行情况,请删除或注释掉@echo off或将该行更改为@echo on ,打开命令提示符窗口并运行批处理文件从此控制台窗口中输入其名称与完整路径中包含在双引号将当前目录更改为该批处理文件应该工作的目录后。

重定向操作符>>左侧的空格字符也由命令ECHO输出,因此也作为尾部空间写入文本文件,这就是为什么在这里去掉了>>左侧的空格字符。 >>的空格字符权将被忽略,但在这里也被删除。

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

  • del /?
  • echo /?
  • endlocal /?
  • for /?
  • setlocal /?
  • set /?

另请参阅Microsoft文章使用命令重定向操作符 。