清除特定子文件夹中的旧文件

时间:2014-05-14 18:52:49

标签: powershell

在我们的用户共享上设置文件夹重定向时,我们遇到了一些不好的做法。我现在有数百个用户文件夹,其中包含Win7用户的标准“下载”文件夹。 询问乞求我们的用户清除他们旧的下载文件并没有成功。随意估计显示需要的大约100Gb数据,我们可以使用该空间。配额将在我们的下一个部署中实施,以帮助防止此类数据蔓延,但现在无法实施。这主要是由于Chrome一直在倾销临时数据。有很多人拥有1-20份相同的文件,非常大/旧的数据等...

我需要浏览每个用户的“下载”文件夹,并清除30天内未修改/未修改的任何内容。我已经看到很多powershell删除文件,但它们似乎都没有解决我正在尝试使用的结构。我是powershell的新手,所以请原谅我的无知。

我需要做的是从D:\ userdata \开始,然后导航一系列结构化的子文件夹,[网站名称] \ [用户名],以进入下载,然后开始清除。只有14个站点,但有很多用户。例如,如果John Doe在休斯顿,他的清除路径将是D:\ userdata \ Houston \ jdoe \ Downloads \。

然而,我需要确保这个脚本不会在结构中更深入。例如,我不需要捕获D:\ userdata \ Houston \ jdoe \ My Documents \ Finance \ Downloads \。出于这个原因,我根本无法删除删除名为Downloads的任何文件夹的内容。

我的想法是,可能有某种方法可以限制搜索的子文件夹深度,或者是将通配符与“if path = D:\ userdata \ * \ * \ Downloads \”或其他内容相匹配的方法效果。

我已经玩弄了只是做一个登录脚本的想法,该脚本会映射到用户。虽然我们的SAN上的启动风暴很难(我们的环境是完全虚拟化和集中化的),所以我真的很想让这个任务在非工作时间窗口从文件服务器运行。我将作为本地SYSTEM帐户执行,以解决我们从Server 2008 R2获得的所有NTFS权限锁定。

2 个答案:

答案 0 :(得分:1)

假设您没有要使用的网站或用户列表,只需枚举d:\userdata下的目录,获取网站,然后根据该目录获取每个用户的路径。

$root = "d:\userdata";
$sites = Get-ChildItem -Path $root -directory;
foreach ($site in $sites) {
    $siteusers = get-childitem -path $site.FullName -Directory;
    foreach ($siteuser in $siteusers) {
        $downloaddir = Join-Path -Path $siteuser.FullName -ChildPath "Downloads";
        Get-ChildItem -Path $downloaddir -Recurse -File | Where-Object{$_.LastWriteTime -lt $(get-date).AddDays(-30)} | Remove-Item -force;
    }
}

显然首先针对非生产数据进行测试


如果您已经有一个站点列表(按目录名称),它看起来几乎相同:

$sites = @("Site1","Site2");
$root = "d:\userdata";
foreach ($site in $sites) {
    $SitePath = Join-Path -Path $root -ChildPath $site;
    $siteusers = get-childitem -path $SitePath -Directory;
    foreach ($siteuser in $siteusers) {
        $downloaddir = Join-Path -Path $siteuser.FullName -ChildPath "Downloads";
        Get-ChildItem -Path $downloaddir -Recurse -File | Where-Object{$_.LastWriteTime -lt $(get-date).AddDays(-30)} | Remove-Item -force;
    }
}

然后,您可以运行此实例的多个实例,每个实例在$sites中都有不同的网站名称列表。

另一种选择是通过get-childitem(进入数组/集合)收集站点名称,然后将其拆分为一个脚本实例处理偶数数组元素,另一个进程奇怪的。

答案 1 :(得分:0)

我最初的想法是运行Get-ChildItem -directory来获取文件夹的一般列表(由于提供程序过滤,即使有数千个文件夹,也能获得相当快的结果)。然后针对指定正则表达式搜索的Where语句运行该语句,以确保您拥有正确的文件夹,例如?{$_.FullName -match "^D:\\userdata\\[^\]+?\\[^\]+?\\Downloads"},并将其传递到ForEach中以查找旧文件。所以,我猜是这样的:

GCI D:\UserData -recurse -directory | ?{$_.FullName -match "^D:\\userdata\\[^\]+?\\[^\]+?\\Downloads"}|%{
    GCI $_.FullName -recurse | ?{$_.LastWriteTime -le (get-date).adddays(-30)}|Remove-Item
}

别管我的答案,使用alroc's,它会更好。留下我的选择并为未来的读者提供参考。