MS DOS脚本只列出前10个文件,按降序排列

5

我正在使用dir abc*.*/o:-d/b >> "testfile1.txt"以降序获取输出。是否有一种方法可以仅获取5/10个文件作为输出。实际上,我想将最新的5个(按修改日期排序)文件存储在testfile1.txt中。

感谢您的回复

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语句,但那需要延迟扩展,而延迟扩展会破坏包含!的文件名。一个正确的解决方案是在循环内切换延迟扩展的开和关。


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 .',因为没有空行需要注意(请参见下面的注释)。

+1;你可以将FINDSTR正则表达式简化为“.”。星号不是必需的 :-) - dbenham
感谢@dbenham。然而,当我将文件管道传递到findstr时,空行只显示“.”被跳过了。我相信我需要星号来修改通配符为“零个或多个”结果。无论如何,我可能还需要调整上述方法,因为它会在以冒号开头的行上出错(@Jeb在另一个线程中指出了这一点)。现在正在寻找解决方案... - Seth McCauley
是的,但在这种情况下,我们不必担心空行。数据来自 DIR /B,而不是文件。因此,不需要使用 *。此外,您不必担心以 EOL 字符(默认为 ;)开头的行,因为您知道每行都以数字开头。 - dbenham
啊,非常好的观点(没有从“dir”发送的空行)。关于EOL字符...我的意思是冒号分隔符,我正在使用它来将行号与内容分开(由findstr添加)。因为for循环将连续的分隔符合并为一个,所以以冒号开头的行将被我的代码剥离掉冒号。但你的观点在这里仍然是有效的:dir /b输出的任何行都不应该以(甚至包含)冒号开头。 - Seth McCauley

0

这必须是批处理文件吗?在PowerShell中这很简单。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接