Windows 如何使用批处理文件获取超过3天且可能有多个目录深度的文件列表

Windows 如何使用批处理文件获取超过3天且可能有多个目录深度的文件列表,windows,batch-file,cmd,Windows,Batch File,Cmd,我们有一个备份目录,可以有一个文件夹结构多达4个文件夹深。备份将根据成功的完整备份自动清除。问题是,有时备份例行程序会失败,我们不知道它有,并且在某些文件夹中没有备份任何文件 任何人都可以通过批处理文件来说明要运行的脚本,该脚本将: 1) 循环浏览所有文件夹 2) 提供超过3天的所有文件的列表 3) 能够说明要从报告中排除的文件或文件夹名称 提前感谢, Jonathan您可以使用/V和/G:file选项将FORFILES结果通过管道传输到FINDSTR,以筛选出要忽略的文件。您可以在批处理脚本中

我们有一个备份目录,可以有一个文件夹结构多达4个文件夹深。备份将根据成功的完整备份自动清除。问题是,有时备份例行程序会失败,我们不知道它有,并且在某些文件夹中没有备份任何文件

任何人都可以通过批处理文件来说明要运行的脚本,该脚本将:

1) 循环浏览所有文件夹 2) 提供超过3天的所有文件的列表 3) 能够说明要从报告中排除的文件或文件夹名称

提前感谢,


Jonathan

您可以使用/V和/G:file选项将FORFILES结果通过管道传输到FINDSTR,以筛选出要忽略的文件。您可以在批处理脚本中直接嵌入要忽略的文件。应使用每个文件的完整路径,并使用引号与FORFILES输出相匹配

我使用/L选项强制搜索使用文字字符串,/X选项确保过滤器使用精确匹配,/I选项使其不区分大小写

请注意,@path表示完整路径,包括文件名。因此不需要@file

此外,FORFILES将列出文件夹,因此您应该使用@ISDIR排除它们

@echo off
forfiles /p n:\ /m * /s /c "cmd /c if @isdir==FALSE echo @path" /d -3 | findstr /vixlg:"%~f0" > c:\temp\output.txt
exit /b

"n:\somePath1\someFileToIgnore1.ext"
"n:\somePath2\someFileToIgnore2.ext"
etc.
如果要排除特定文件夹中的所有文件,则需要修改上述脚本以使用正则表达式,使用\R而不是\L。可以构造正则表达式来指定特定文件、特定文件夹中的所有文件或文件夹树中的所有文件

反斜杠文字必须转义为
\\
,句点文字转义为
\.
。排除文件夹中的文件使用
[^\\]*
表示文件-它匹配除反斜杠以外的任何字符串。排除文件夹树使用
*
匹配任何字符串以匹配文件夹和文件

@echo off
forfiles /p n:\ /m * /s /c "cmd /c if @isdir==FALSE echo @path" /d -3 | findstr /vixrg:"%~f0" > c:\temp\output.txt
exit /b

"n:\\somePath1\\someFileToIgnore1\.ext"
"n:\\somePath2\\ignoreFilesInThisFolder\\[^\\]*"
"n:\\somePath3\\ignoreFilesInThisFolderTree\\.*"
etc.

第1部分和第2部分可以使用
forfiles.exe
完成。第3部分需要进一步解释您计划如何提供文件和文件夹名称。您想要一个在旧的16位MS-DOS操作系统或现代版本的Windows上工作的答案吗?@foxdrive,我正在考虑在批处理文件中有一个指定文件夹或文件名的部分(可能有完整的UNC路径),脚本在输出报告时会忽略该文件或文件夹。@Ross Ridge-我使用的是Windows 7I,我已经做到了:
FORFILES/p N:\/m*/s/c“cmd/c echo@path@file"/D-3>>c:\temp\output.txt
问题出在目录中,子目录中有许多超过3天的文件,这些文件是为了存档而保存的,但是,它们在输出文件中报告,这使得很难看到哪些文件“真正”3天或更久,需要进行调查。感谢@dbenham,理想情况下,我希望排除整个目录(以及其中的所有文件)以及一些文件。例如:N:\sets\folder\u 1 N:\sets\folder\u 2\N:\sets\zip.zip在上面的示例中,我希望排除整个folder\u 1目录和zip.zip文件,但在folder\u 2Oops中列出所有超过3天的文件时,我遇到了一个错误-我忘了包含指定文字搜索的\L选项。但如果要排除整个文件夹,则需要使用正则表达式。答案已更新。你好@dbenham,谢谢。当我运行它时,我得到以下消息:“进程试图写入一个不存在的管道”@Jonathan-我无法想象为什么它会失败。我已经测试过了,它对我来说很好。嗨@dbenham,你运行的语法和你发布的完全一样吗?