4

dir abc*.*/o:-d/b >> "testfile1.txt"用来按降序获取输出。有没有办法只获得 5 / 10 个文件作为输出。实际上我想将最新的 5 个(按修改日期排序)文件存储在 testfile1.txt 中。

感谢您的回复

4

3 回答 3

8
@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 语句,但这需要延迟扩展,并且延迟扩展会损坏包含!. 具有延迟扩展的适当解决方案必须在循环内打开和关闭延迟扩展。

于 2012-08-13T12:33:43.000 回答
3

我知道我在这个方面有点晚了,但是这个怎么样:

@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"

这是我为完成这项工作所做的工作:

  • 将您的 dir 语句导入 findstr 以对每一行进行编号(dir abc*.*/o:-d/b | findstr /n 。
  • 通过 for 循环运行它以将行号与内容分开(使用"tokens=1* delims=:"
  • 使用 if 语句验证当前行 # 是否小于或等于 "5" ( if %%a leq 5... )
  • 导出与您指定的文件匹配的所有行(echo.%%b>>"testfile1.txt"

编辑:将 ' findstr /n .* ' 更改为 ' findstr /n 。',因为没有空行需要注意(请参阅下面的评论)。

于 2012-10-26T07:07:19.043 回答
0

必须是批处理文件吗?这在 PowerShell 中是微不足道的。

要使用普通的旧批处理文件执行此操作,您将需要类似于 head 实用程序的东西,以仅获取前几行输出。

您可以在此处调整解决方案以满足您的需求(请注意答案中有关“winhead.cmd”小脚本的部分): 批处理命令仅从输入中获取第一行

于 2012-08-13T08:56:06.100 回答