【问题标题】:Possible to Sort/Order files in a FOR Loop?可以在 FOR 循环中对文件进行排序/排序吗?
【发布时间】:2019-06-21 17:47:43
【问题描述】:

我已经进行了一些挖掘,但似乎无法在任何地方找到简单的答案,也许我在寻找错误的地方。我只想按文件的修改时间(从最旧到最新)对文件进行排序。这可能吗?

for %%i in (Input/*.json) do (

)

【问题讨论】:

  • 打开命令提示符窗口并运行dir /? 和下一个for /? 并阅读这两个Windows Commands 的输出帮助页面以了解批处理文件的以下命令行:for /F "eol=| delims=" %%I in ('dir Input\*.json /A-D /B /OD 2^>nul') do echo File "%%I" has time %%~tI。我曾经在Bat file to delete files only when younger files are present 上写了一个很长的答案,其中包含您可能感兴趣的信息。
  • 这很完美,谢谢。我会读一读,我有很多东西要学:)

标签: batch-file cmd


【解决方案1】:

要改进Benanswer,只需

  1. /S 添加到DIR 以使%%~tA%%~fA 工作(完整路径),并且
  2. 使用"tokens=*"/F 来支持文件名中的空格(检查FOR /?

换句话说:

FOR /F "tokens=*" %%a IN ('DIR /B /S /O:D /A:-D Input\*.json') DO (
 ECHO "%%a"
)

【讨论】:

  • 这是我的一个很好的附录,我清楚地在火车上写了这个,显然忽略了将 int 放入 "tokens=*" 中,无论如何我都应该这样做。我确实记得,虽然我提到了 /S 功能,如果他们想要子目录,但这是一个有效的解决方法,只要他们没有子目录,或者我们将 ^|findstr /i /v ".*\\input\\.*\\.*" 附加到 DIR cmd 中的 @987654334 @循环
【解决方案2】:

如果您只想对它们进行排序,那么 DIR 将是最快的路线,您可以使用 FOR /F 循环解析该输出。

此代码将为您提供升序日期:

FOR /F "tokens=*" %%A IN ('
  DIR /B
  /O:D
  /A:-D 
  Input\*.json
') DO (
  ECHO(Found: "%%~A"
)

/O 选项更改顺序。 /O:D/OD 订单日期升序(最早的在前)/O:-D/O-D 订单日期降序(最新的在前)

/A 选项更改所选项目的类型。 /A:-D/A-D 选择文件项目,/A:D/AD 选择目录项目。

/B 选项仅输出文件名,除非/S 开关与它一起使用来递归目录树,在这种情况下它将输出文件路径。

唯一的问题(没有/S)是:

当您查看子目录而不是同一目录时,您无法从输出中提取任何其他 FOR 变量信息。

IE:你不能用%%~tA来打印日期/时间,%%~fA会给出错误的文件路径。

如果需要返回这些信息,则必须单独查找信息或从 DIR cmd 中抓取所需信息,或使用递归子目录的 /S 选项。

感谢@Michel de Ruiter 注意到这一点,并提请我注意更新这一点,现在我将扩展你的扩展位。

如果您想从 for 循环中获取路径或时间戳等,但又不想浪费时间或从子目录中获取结果,您可以修改为以下版本。

这使用Findstr 使用基本正则表达式删除初始搜索目录下的所有子目录。

FOR /F "tokens=*" %%A IN ('
  DIR /B
  /O:D
  /A:-D 
  Input\*.json
  ^| findstr /i /v "\\input\\.*\\.*"
') DO (
  ECHO(Found: "%%~A"
)

在这种用法中,findstr 命令使用这些开关来匹配正则表达式,该正则表达式匹配可能匹配文件的任何子目录(由于dir cmd 上的选项,如上所述,跳过没有文件的目录)

/i 选项表示不区分大小写

/v 选项表示排除与模式匹配的结果

模式出现在双引号 "\\input\\.*\\.*" 这是一个基本的正则表达式,其中句点 . 匹配任何内容,而 astrix * 表示数学上的前一个字符任何时间,所以.* 表示匹配任何字符零次或多次。

\\ 匹配目录路径的反斜杠 \ 是普通正则表达式中的转义字符,在 findstr 中,我们可以将其设置为 \\\ 以正确匹配,我选择了 \\,因为与所有平台上为正则表达式定义的语法一致。

最后,我们必须有一个尾随 `.\." 以确保我们忽略与子目录相关的所有条目。

请注意,通过在FOR 循环的命令部分中使用findstr,可以更快地执行。

【讨论】:

    猜你喜欢
    • 2013-01-19
    • 2018-07-01
    • 2018-10-22
    • 2018-07-29
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多