为什么即使我没有使用 /S 参数,Forfiles 也会递归?

Why is Forfiles recursing even though I'm not using the /S parameter?

在 Windows Server 2008 R2 Standard 上的 Windows 批处理文件中,我尝试使用 Forfiles 命令而不递归我的文件,但它仍然递归,即使我没有使用/S 参数。

如何让它停止递归

我已经尝试过使用@path 和@file,甚至使用/s。当我使用 /S 时,递归的数量是荒谬的!

ForFiles /p "C:\temp" /d -30 /c "cmd /c dir @path" >temp.txt

在上面的代码中,我希望 temp.txt 只显示指定文件夹中的文件,而不是任何子文件夹中的文件。

我有一个临时解决方案,您可以试试。这有点 hacky,但它可能适用于您正在尝试做的事情。

/M "\*.\*" 添加到您的命令中,它将跳过目录,除非它们的名称中通常没有 .。我没有看到它递归子目录,但无法使用该命令屏蔽目录。我使用

尝试了几次
dir /b /a-d

这会获取所有非目录的列表,但我无法将结果通过管道传输到 forfiles 命令以使其用作输入来进行日期屏蔽。感到抱歉 部分解决方案。

让我们考虑一下您要求系统执行的操作:

Forfiles /p "C:\temp" /d -30

上面的命令几乎符合您的预期,找到任何 file/folder 超过 30 天的。

/c "cmd /c dir @path"

这不是你想的那样。您实际上是在要求 cmddir forfiles 找到的每个匹配项,并执行每个 @path 的完整目录,包括文件夹。假设您有一个超过 30 天的目录:

C:\Temp\oldInstalldir\

你告诉 cmd.exe 做:

dir "C:\Temp\oldinstalldir"

以及 c:\temp 中每个文件的目录。所以你真正想要的是列出你找到的超过 30 天的文件,这些文件 forfiles 已经为你找到了,所以一个可行的解决方案是 echo 它们。

ForFiles /p "C:\temp" /d -30 /c "cmd /c echo @path">temp.txt

或仅按文件名(无路径):

ForFiles /p "C:\temp" /d -30 /c "cmd /c echo @file">temp.txt