查找文件移动到文件夹的日期

时间:2016-02-15 06:16:22

标签: file date powershell

好的,这是场景。我有一个人们可以用来共享数据的文件夹。快速简便,无需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天,它将被删除。复制文件没有问题,复制时会获得新的创建日期。它只是移动的文件。

那么问题,如何找到文件移入文件夹的日期,以免意外删除?

3 个答案:

答案 0 :(得分:0)

此主题可能已在此处介绍过:Finding Modified Date of a file/folder

这或多或少是您正在寻找的,或者您是否正在寻找创建日期?我想可能有些文件可能是在2016年1月1日创建的,但用户可能会经常修改它,因此可能会在2016年2月15日进行最后一次修改。我确定你不想删除它,否则你会有一个非常愤怒的最终用户。

答案 1 :(得分:0)

好的,如此简短的回答是无法做到的。最后,我不得不将该文件夹复制到另一台服务器上的存档文件夹作为备份,然后删除该文件夹中的所有内容。然后,备份将在10天后删除。

但是我在路上发现了一些事情。

  1. 使用Robocopy移动文件也会删除根文件夹。对于某些情况,这可能没问题,但是根文件夹对它的权限不是用简单的“make directory”命令创建的
  2. 在powershell中使用Move-Item不喜欢在服务器之间工作
  3. Powershell受限于Windows的路径和文件长度限制
  4. 我最终做的是先将所有文件复制到存档

    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命令没有冲突。 )

statfind的Windows端口在Git安装中是偶然提供的: https://git-scm.com/download/win

我还发现了这个Powershell脚本-尚未尝试过,但是它的目的是获取文件的ChangeTimehttps://gallery.technet.microsoft.com/scriptcenter/Get-MFT-Timestamp-of-a-file-9227f399