显示具有特定字符串

时间:2017-02-23 09:16:07

标签: powershell

在Windows 2008 R2中,我有一个像这样的共享文件夹结构

D:\USERS

D:\USERS\USER1
D:\USERS\USER1\AUTOBACKUP
D:\USERS\USER1\DROP
D:\USERS\USER1\EXHIBIT

D:\USERS\USER2
D:\USERS\USER2\AUTOBACKUP
D:\USERS\USER2\DROP
D:\USERS\USER2\EXHIBIT

有100个用户文件夹,所有用户都在那里复制 AUTOBACKUP 文件夹中的重要数据。每个 AUTOBACKUP 文件夹中都包含多个子文件夹和文件。

我的要求是仅显示在过去1个月内未更新的 AUTOBACKUP 文件夹名称,表示在任何自动备份或其子文件夹中都没有写入文件。 (我不需要删除/展示文件夹的详细信息,因为它可以由any1更新,但自动备份只能由相应的用户更新)

结果类似于:

D:\USERS\USER1\AUTOBACKUP - Updated
D:\USERS\USER2\AUTOBACKUP - ALERT: Not updated since last month ...

或仅向自上次未自上次更新的用户显示结果。

我试图通过powershell命令获得结果,但是如果有人更新了drop / exhibit,它会显示结果,并且我想在搜索条件中排除它们,搜索应该只在自动备份中完成。

更新: 好的我正在尝试跟踪脚本,但遇到长路径错误。文件夹很深,意味着自动备份文件夹里面有几个子文件夹,文件名也很长,因此会出错。如何克服这个问题:(

$users = Get-Content C:\myusers.txt   
$lastMonth = (Get-Date).AddMonths(-1)
$backupfiles = Get-ChildItem $path -Recurse
$logLocation = "D:\mylog.log"
foreach ($user in $users){
    $path = "D:\Users\$user\AUTOBACKUP"
    $backupfiles = Get-ChildItem $path -Recurse
    foreach ($file in $backupfiles){
        $modifiedDate = $file.LastWriteTime
        if ($modifiedDate -ge $lastMonth){
            $nobackup = $false
            break
            } else {
            $nobackup = $true
            }
        }
        if ($nobackup){
            Add-Content -Path $logLocation -Value "$filepath  -  NOBACKUP"
        }
    }

2 个答案:

答案 0 :(得分:3)

Get-ChildItem 'D:\USERS' -Directory | ForEach-Object {

    $RecentAutoBackupFiles = @(
        Get-ChildItem -Path "D:\USERS\$($_.Name)\AUTOBACKUP" -File -Recurse | 
            Where-Object { $_.LastWriteTime -ge [datetime]::Now.AddMonths(-1) }
        )

    if (0 -eq $RecentAutoBackupFiles.Count)
    {
        "$($_.Name) - ALERT no files in AUTOBACKUP since 1 month ago"
    }
}

未经测试...

答案 1 :(得分:1)

尝试这样的事情

Get-ChildItem D:\Users -Recurse -ErrorAction SilentlyContinue | ? { $_.IsContainer -and $_.Name -eq "AUTOBACKUP" } | Select fullname,@{Name="Status";Expression={if ($_.lastwritetime -lt ((Get-Date).AddMonths(-1))) { "Updated" } else { "ALERT: not updated since $($_.lastwritetime)" } }}

这应该得到D:\ Users的每个子对象,然后只用“AUTOBACKUP”名称过滤目录,最后显示过滤目录的完整路径+名称和基于最后写入时间的条件字符串。夹