以下是我想做的事情:
使用 .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
怎么运行的
首先初始化target
和days
变量。第一个设置为要扫描的文件夹,后者是天数。负值表示大于或等于。
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