使用 CMD 为文件夹中所有文件的最后修改日期生成日志?

Posted

技术标签:

【中文标题】使用 CMD 为文件夹中所有文件的最后修改日期生成日志?【英文标题】:Generate log for last modified date of all files in a folder using CMD? 【发布时间】:2021-12-15 04:25:26 【问题描述】:

我有一个包含大约 130 个文件的文件夹,我想使用 CMD 提示符生成一个包含所有文件名和最后修改日期的 .txt 文件。我已经研究了 DIR 和 .LastWriteTime 但我无法弄清楚。我对这个主题的所有搜索都导致使用 Powershell 或 Batch 或 Linux,但我没有任何这些资源,只有 CMD。我是使用 CMD 的新手,但最糟糕的是我大约一个月前完成了这项工作,我不记得我是如何完成这项工作的!令人难以置信的沮丧。

非常感谢!

编辑:如果有帮助的话,上次我使用了这样的命令(我忘记了,而且我这辈子似乎无法再次找到),它生成了以下文件,也许这可能作为我正在谈论的命令的视觉提示。再次感谢!

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2/10/2018   3:55 PM      162256779 mobizen_20180210_155420.mp4
-a----         2/10/2018   4:18 PM      111595959 mobizen_20180210_161816.mp4
-a----         2/10/2018   4:20 PM       32643884 mobizen_20180210_162027.mp4
-a----         7/15/2018   6:15 PM       60733357 mobizen_20180715_181514.mp4
-a----          8/5/2018   5:08 PM      126381736 mobizen_20180805_170721.mp4
-a----         8/30/2018   4:53 PM       81903211 mobizen_20180830_165306.mp4

【问题讨论】:

您的问题中显示的命令输出来自 PowerShell,例如 Get-ChildItem -Path 'C:\Users\cangrejo\Music' -Filter *.mp4 -File。但是,这提供了比您需要的更多信息,因此您可能希望select 仅您需要的部分,例如Get-ChildItem -Path 'C:\Users\cangrejo\Music' -Filter *.mp4 -File | Select-Object -Property LastWriteTime, Name。如果您想在 cmd 中执行此操作,那么也许这就是您想要的,For %G In ("C:\Users\cangrejo\Music\*.mp4") Do @Echo %~ntxG。我将留给您添加所需的命令以将每个命令输出到.txt 文件。 该输出来自 PowerShell 命令:Get-ChildItem -Path 'X:\somefolder' | Format-Table -AutoSize 或者你甚至可以在 PowerShell 中使用它来稍微偏离网格,Get-CimInstance -Query "Select * From Cim_DataFile Where Drive='C:' And Path='\\Users\\cangrejo\\Music\\' And Extension='mp4'" | Select-Object -Property @Label = 'Name'; Expression = Split-Path $_.Name -Leaf, @Label = 'LastWriteTime'; Expression = $_.LastModified 您也可以使用ForFiles 实用程序在 cmd.exe 中执行任务,输出字符串的附加功能是双引号,例如%SystemRoot%\System32\forfiles.exe /P "C:\Users\cangrejo\Music" /M *.mp4 /C "%SystemRoot%\System32\cmd.exe /D /C \"If @IsDir==FALSE Echo @FDate @File\"". 【参考方案1】:

由于问题是特定于使用cmd,而不是batch-file,或powershell...

我对这个主题的所有搜索都导致使用 Powershell 或 Batch 或 Linux,但我没有任何这些资源,只有 CMD。

...你不应该包含这些标签。

正如你特别声明的那样,你……

想要使用 CMD 提示生成一个包含所有内容的 .txt 文件 他们的名字和最后修改日期。

…不是文件属性、文件大小或类似表格的标签标题;以下是对我开场评论中示例代码的修改。这次确保包含所有文件,根据您的问题,(标准for 循环枚举非隐藏文件),并包括将结果重定向到.txt 文件也是。

下面的例子使用了目标目录的相对路径,(.\Music),和输出文件,(.\Desktop),所以你可能希望更改这些以适合您的实际情况。另请注意,您在问题正文中发布的 PowerShell 输出已按文件名的字母顺序输出其结果,我确保这样做也是如此。

Dir ".\Music" /B /A:-D 1>NUL 2>&1 && (For /F "Delims= EOL= " %G In ('Dir ".\Music" /B /A:-D /O:N 2^>NUL') Do @For %H In (".\Music\%G") Do @Echo %~ntxH) 1> ".\Desktop\list.txt"

附带说明,如果您还希望拥有属性和文件大小,就像在 PowerShell 输出中一样,也可以通过简单的更改来实现:

Dir ".\Music" /B /A:-D 1>NUL 2>&1 && (For /F "Delims= EOL= " %G In ('Dir ".\Music" /B /A:-D /O:N 2^>NUL') Do @For %H In (".\Music\%G") Do @Echo %~antxzH) 1> ".\Desktop\list.txt"

【讨论】:

【参考方案2】:

您可以从批处理文件中调用powershell.exe,PowerShell CLI - 这样的调用在性能方面代价高昂,但可以让您访问 PowerShell 的卓越功能:

在最简单的情况下:

@echo off

:: Add / remove property names in the Select-Object call as needed.
:: If the dir. path has embedded spaces, enclose it in '...' or \"...\"
powershell.exe -noprofile -c ^
  "Get-ChildItem C:\Users\cangrejo\Music\*.mp4 | Select-Object Mode, LastWriteTime, Length, Name" ^
  > out.txt

注意:上面选择的带有Select-Object 的输出列(属性)恰好是Get-ChildItem 的格式化输出中显示的默认 列集。如果这个默认设置可以,你可以省略Select-Object 调用;否则,请修改属性名称列表以满足您的需要。

请注意,生成的文件包含为人类观察者而非编程处理格式化的输出。 (如果您想更好地控制这种用于显示的格式,可以将数据通过管道传输到 PowerShell 的 Format-* cmdlet 之一,例如 Format-Table。)

如果您需要稍后进行编程处理,请通过 PowerShell 的 Export-Csv cmdlet 使用结构化文本格式(例如 CSV):

@echo off

powershell.exe -noprofile -c ^
  "Get-ChildItem C:\Users\cangrejo\Music\*.mp4 | Select-Object Mode, LastWriteTime, Length, Name | Export-Csv -NoTypeInformation out.csv"

无论哪种方式,您都可以在输出之前通过管道轻松添加排序Sort-Object LastWriteTime -Descending

字符编码注意:

在第一个命令中,cmd.exe 使用活动代码页的编码保存到文件中,这反映在chcp 的输出中;默认为活动 OEM 代码页。

在第二个命令中,它使用的是 PowerShell 的 Export-Csv cmdlet 的默认编码,在 Windows PowerShell 中默认为 ASCII(!)(幸运的是,在 PowerShell (Core) 7+ 中它现在是(BOM-less)UTF -8);使用-Encoding 参数指定不同的编码;您可以通过将 | Out-File -Encoding ... 附加到 PowerShell 命令而不是让 cmd.exe 保存文件来将相同的技术应用于第一个命令。

【讨论】:

【参考方案3】:

对于任何目录,您的结果将由默认命令返回,只需按扩展名过滤即可。请注意,这不是以正确方式快速处理的最佳方法请参阅@mklement0 已经提供的更好的 PowerShell 解决方案

PowerShell Get-ItemProperty -Path *.mp4

然后要保存到文件列表,请添加> MP4.log

如果文件位于您使用的另一个目录中

PowerShell Get-ItemProperty -Path 'c:\some folder\with a space\*.mp4' > MP4.log

注意 PowerShell 中带有空格的路径的“单引号”。

注意:- 如果您不需要第一个模式列,您可以在命令行中执行类似操作(对我而言,CMD 比 PowerShell 快)但您可能需要编辑本地时间输出(忽略我的虚拟数据只是几个我重命名的旧文件)请注意,列表应默认为写入时间,但如果您的列表有任何其他覆盖,您可以添加 /T:W。

同样,@Compo 提供了更好更全面的 cmd 解决方案。

@echo Last Time written by me      Length Name>mp4.log & echo ---- ---- ------- -- --      ------ ---->>mp4.log & dir /A:-D /O:D |find ".mp4" >> mp4.log & type mp4.log

【讨论】:

请注意 KJ,提到 DIR 的输出取决于区域设置,因此使用的字符数可能与输出中的字符数不匹配,如果文件大小较大,则数字他们输出中的字符数也会改变。这两者加在一起可能会破坏您想要的固定宽度的类似表格的输出。 顺便说一句:获取 System.IO.FileInfo 实例的 PowerShell 惯用方法是 Get-ChildItem -Path 'c:\some folder\with a space\*.mp4' 或 - 当性能很重要时 - 使用 -Filter 参数,Get-ItemProperty -LiteralPath 'c:\some folder\with a space' -Filter *.mp4。在文件系统的上下文中,Get-ItemProperty 实际上从未使用过 - 您可以使用 -Name 传递属性名称,但格式化的输出没有帮助。

以上是关于使用 CMD 为文件夹中所有文件的最后修改日期生成日志?的主要内容,如果未能解决你的问题,请参考以下文章

如何用java获取一个文件的创建时间

查看使用 Linux 命令修改文件的所有日期/时间

如何使用 bash 脚本检查 AIX 中文件的最后修改日期?

如何在文件系统中获取最后修改的日期和时间?

如何获取 ADLS Gen2 文件的最后修改日期并将其保存到 python 中的 csv

vscode自动生成模版name默认为文件名mac版