我在一个文件夹中有多个文本文件。我想打印与文件名模式*.Config
匹配的文件夹中找到的每个文件的最后一行,并将这些行重定向到新的文本文件。
以下脚本适用于1个文本文件。但目前我为多个文本文件执行了 for 循环,而%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
)
)
答案 0 :(得分:1)
使用此批处理代码将当前目录中的每个* .config文件的最后一行写入当前目录中的文件vResult.txt
:
@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 输出错误消息来处理 STDERR ,方法是将其重定向到设备 NUL 如果要删除的文件不存在。
外部 FOR 在当前目录中搜索*.config
个文件,但未设置隐藏属性。这里不需要使用命令 DIR ,除非有必要找到隐藏的* .config文件。
内部 FOR 处理外部 FOR 循环找到的每个* .config文件的行。通常建议将文件名括在双引号中,并使用usebackq
将双引号文件名解释为文件名,而不是在* .config文件包含空格字符时要处理的字符串。 delims=
禁用在空格/制表符上拆分每一行以获得整行。
由于在命令块中定义/修改了环境变量LastLine
,因此必须使用延迟扩展作为开头时启用,并使用感叹号而不是百分号来引用环境变量。
在执行外部 FOR之前,所有在外部 FOR 的每次迭代中执行的整个命令块的百分号引用的环境变量都已被Windows命令解释器替换为引用环境变量的当前值命令。在第一次执行外部 FOR 之前,这导致您的批处理代码在 ECHO 命令行中错误地循环替换%lastline%
。
要调试批处理文件并查看Windows命令解释程序在预处理命令行和命令块后实际执行的操作,请删除或注释掉@echo off
或将该行更改为@echo on
,打开命令提示窗口,并在将当前目录更改为批处理文件应该工作的目录后,通过在双引号中用完整路径输入其名称来运行该控制台窗口中的批处理文件。
重定向运算符>>
左侧的空格字符也由命令 ECHO 输出,因此也作为尾随空格写入文本文件,这就是为什么空格字符留在{此处删除{1}}。 <{1}}的空格字符权限将被忽略,但此处也会被删除。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
>>
>>
del /?
echo /?
endlocal /?
for /?
另请参阅Microsoft文章Using command redirection operators。