在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"
}
}
答案 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”名称过滤目录,最后显示过滤目录的完整路径+名称和基于最后写入时间的条件字符串。夹