解决方案

解决方案

以下是我想做的事情:

使用 .cmd 脚本中的 forfiles 命令从指定路径删除 win7 机器上超过 2 天的文件夹。

编辑:情况如下,在路径 X:\backups 下是包含每日备份的文件夹,例如 25.06.2014,下一个文件夹 24.06.2014 等等。

我现在对此有疑问:

  • /d 在帮助中总是强调 --files--。所以我不确定这是否也适用于文件夹。
  • 尤其是我不确定它与 /s 结合会做什么。所以它只会遍历文件夹并删除文件 - 但如果父文件夹已经太旧了怎么办?顺便说一句,整个递归概念对我来说并不清楚,我无法找出它的含义。它只是意味着遍历文件夹,对吗?
  • 如果要使用 IF 语句,那么我必须使用 2 个变量 @ISDIR 和 @FDATE。使用此解决方案,我不知道如何在 forfiles 命令中组合 2 个 If 语句,此外,我不确定 @FDATE 是否仅适用于文件而不适用于文件夹。

那么如何正确做到这一点?

forfiles参考: http://technet.microsoft.com/de-de/library/cc753551%28v=ws.10%29.aspx

问候!

答案1

解决方案

尽管名称如此,该forfiles命令能够处理这两个文件文件夹。下面是执行该作业的批处理脚本:

@echo off
setlocal

set target=X:\backups
set days=-2

for /f "usebackq delims=" %%G in (
`forfiles /p "%target%" /c "cmd /c if /i @isdir == true echo @path" /d %days% 2^>nul`
) do echo rd /s /q "%%~G"

pause
endlocal & exit /b

怎么运行的

首先初始化targetdays变量。第一个设置为要扫描的文件夹,后者是天数。负值表示大于或等于

forfiles然后通过指定先前设置的文件夹和天数来运行该命令。对于每个结果,@isdir都会检查特殊变量:如果值为true当前条目是一个文件夹,则@path回显它。然后解析命令输出以获取所有匹配的文件夹并删除它们。出于安全原因,有一个额外的echo命令,以便您可以检查是否删除了正确的文件夹。

使用递归开关 ( /s) 时,将处理所有文件、文件夹及其子文件夹。在这种情况下,您不想这样做;否则,您可能会删除新文件夹中包含的旧子文件夹,而这些子文件夹根本不应该被触及。

进一步阅读

答案2

单行 PowerShell 无法完全满足您的需求。它不包含文件列表的完整路径。此外,您可能需要递归。这有效:


获取子项“D:\backup”|?{$.psiscontainer - 和 $.lastwritetime -le (get-date).adddays(-0)} |% {remove-item D:\backup\$_ -force -recurse -whatif}


答案3

以下是单行 PowerShell 方法:

get-childitem "x:\backups" |? {$_.psiscontainer -and $_.lastwritetime -le (get-date).adddays(-2)} |% {remove-item $_ -force -whatif}

您可以通过 adddays 参数调整年龄阈值。这仍然处于“WhatIf”模式,因此您可以先测试一下,看看会发生什么。删除 -whatif 以使其真正删除文件夹。

来源:TechNet 论坛

答案4

它应该如何在 WIndows server 2019 上运行?我认为“`”在新操作系统上有问题

@echo off
setlocal

set target=X:\backups
set days=-2

for /f "usebackq delims=" %%G in (
`forfiles /p "%target%" /c "cmd /c if /i @isdir == true echo @path" /d %days% 2^>nul`
) do echo rd /s /q "%%~G"

pause
endlocal & exit /b

相关内容