我正在使用dir abc*.*/o:-d/b >> "testfile1.txt"
以降序获取输出。是否有一种方法可以仅获取5/10个文件作为输出。实际上,我想将最新的5个(按修改日期排序)文件存储在testfile1.txt中。
感谢您的回复
我正在使用dir abc*.*/o:-d/b >> "testfile1.txt"
以降序获取输出。是否有一种方法可以仅获取5/10个文件作为输出。实际上,我想将最新的5个(按修改日期排序)文件存储在testfile1.txt中。
感谢您的回复
@echo off
setlocal
set /a "n=0, limit=5"
>"testfile1.txt" (
for /f "eol=: delims=" %%F in ('dir /o-d /b abc*.*') do (
echo %%F
2>nul set /a "n+=1, 1/(limit-n)"||goto :break
)
)
:break
我故意除以0来检测是否达到了极限。我本可以使用IF语句,但那需要延迟扩展,而延迟扩展会破坏包含!
的文件名。一个正确的解决方案是在循环内切换延迟扩展的开和关。
@echo off
for /f "tokens=1* delims=:" %%a in ('dir abc*.*/o:-d/b ^| findstr /n .') do if %%a leq 5 echo.%%b>>"testfile1.txt"
这必须是批处理文件吗?在PowerShell中这很简单。
要用普通的批处理文件完成此操作,您需要类似于head实用程序的东西,以仅获取输出的前几行。
您可以根据需要调整此处的解决方案(请注意答案中有关“winhead.cmd”脚本的部分): 批处理命令 - 仅从输入中取第一行
DIR /B
,而不是文件。因此,不需要使用*
。此外,您不必担心以 EOL 字符(默认为;
)开头的行,因为您知道每行都以数字开头。 - dbenhamfindstr
添加)。因为for循环将连续的分隔符合并为一个,所以以冒号开头的行将被我的代码剥离掉冒号。但你的观点在这里仍然是有效的:dir /b
输出的任何行都不应该以(甚至包含)冒号开头。 - Seth McCauley