好的,这是场景。我有一个人们可以用来共享数据的文件夹。快速简便,无需USB。然而,他们倾向于将数据留在那里并且它正在填满HDD。我想删除30天以上的所有内容。我打算用powershell做这个 -
$limit = (Get-Date).AddDays(-30)
$path = "C:\temp"
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force -whatif
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse -whatif
我离开了-whatif,因为这样可以更容易测试。
所以我测试了它,它工作正常,但在测试期间我遇到了一个小问题。移动的文件保留其原始创建日期。为什么这很重要?因为用户可能会在脚本运行前5分钟将某些内容移动到文件夹中,并且如果创建日期超过30天,它将被删除。复制文件没有问题,复制时会获得新的创建日期。它只是移动的文件。
那么问题,如何找到文件移入文件夹的日期,以免意外删除?
答案 0 :(得分:0)
此主题可能已在此处介绍过:Finding Modified Date of a file/folder
这或多或少是您正在寻找的,或者您是否正在寻找创建日期?我想可能有些文件可能是在2016年1月1日创建的,但用户可能会经常修改它,因此可能会在2016年2月15日进行最后一次修改。我确定你不想删除它,否则你会有一个非常愤怒的最终用户。
答案 1 :(得分:0)
好的,如此简短的回答是无法做到的。最后,我不得不将该文件夹复制到另一台服务器上的存档文件夹作为备份,然后删除该文件夹中的所有内容。然后,备份将在10天后删除。
但是我在路上发现了一些事情。
我最终做的是先将所有文件复制到存档
robocopy $SourceFolder $DestinationFolder /e
然后我想删除所有文件。如果路径长度超过248个字符,则由于文件和路径长度限制,哪个Remove-Item无法执行。再次,robocopy救援。我有一个空文件夹。什么都没有。并且要删除其他文件夹中的所有项目,无论路径和文件长度如何,我都会镜像空白文件夹。
robocopy /mir $EmptyFolder $SourceFolder
我已经有了一个PowerShell脚本,所以我把这些命令放在那里。但由于它不是powershell命令,因此您可以将变量替换为实际文件夹,并将命令直接放入.bat文件中。
从这里开始,我只是安排了一个计划任务,每个月运行一次脚本,以保持文件夹免于混乱。
我希望这可以帮助其他任何尝试做类似事情的人。
答案 2 :(得分:0)
事实证明,Windows中有一个隐藏的第四次修改时间:ChangeTime。据我了解,它存储在一个单独的地方,并且不会被普通的API返回-我认为它是主文件表的一部分。 (也许取决于您的文件系统类型?)该描述是否正确,请考虑以下事项:
C:\Users\erhannis\Downloads\nsx220en>stat nsx-2.2.0
File: nsx-2.2.0
Size: 0 Blocks: 4 IO Block: 65536 directory
Device: c6194f59h/3323547481d Inode: 7318349397564576 Links: 1
Access: (0755/drwxr-xr-x) Uid: (1056947/ erhannis) Gid: (1049089/ UNKNOWN)
Access: 2016-03-24 14:41:17.880026600 -0400
Modify: 2016-03-24 14:41:17.880026600 -0400
Change: 2020-12-01 17:03:41.697541400 -0500
Birth: 2016-03-24 14:35:09.540397700 -0400
(请参阅相关程序的链接。)
Change:
旁边列出的时间是我将文件夹从一个位置移动到另一个位置的时间。移动文件时,Change
日期会更新。注意:我尝试移动一个充满文件的文件夹,并且看来只有根对象的ChangeTime
被更新。因此,出于您的目的,您将考虑给定文件的最后ChangeTime
是文件ChangeTime
和任何父目录中的最新文件。 (或者,当您遇到变更时间太新时,只需停止递归到目录中;这取决于您的操作方式。)
也许更相关,Linux find
命令具有参数-cmin
,可让您按“比X更新的元数据”进行过滤。因此,例如,find -cmin -5
递归查找所有元数据(例如,上次移动时)在五分钟前发生变化的项。 (find -cmin 5
会查找5分钟前更改过的文件。)(在Windows上,我将find
命令重命名为其他名称,因此它与默认的Windows find
命令没有冲突。 )
stat
和find
的Windows端口在Git安装中是偶然提供的:
https://git-scm.com/download/win
我还发现了这个Powershell脚本-尚未尝试过,但是它的目的是获取文件的ChangeTime
。
https://gallery.technet.microsoft.com/scriptcenter/Get-MFT-Timestamp-of-a-file-9227f399