2017-02-23 3 views
0

в 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 есть несколько подпапок и файлов.

Мои требования должны отображаться ТОЛЬКО AUTOBACKUP имя папки, которые не обновляются за последние 1 месяц, означает, что файл не написан ни в каком автозапуске или в его подпапках. (Я не требует падения/экспонат папки детали, как она может быть обновлена ​​any1, но Autobackup можно обновить только с помощью соответствующего пользователя)

Результат Что-то вроде:

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

или показать мне результат только для пользователей чья автоматическая резервная копия не обновилась с прошлого месяца.

Я попытался получить результат с помощью команд powershell, но он показывает мне результаты, если кто-то обновляет drop/экспонат, и я хочу исключить их в критериях поиска, поиск должен выполняться только в autobackup.

ОБНОВЛЕНО: Хорошо, я пытаюсь использовать следующий скрипт, но попадает в проблему с ошибкой длинного пути. папки глубокие, значит, в папках autobackup есть несколько подпапок внутри него с длинными именами файлов, поэтому возникает ошибка. МЕТОДИЧЕСКИЕ преодолеть этот вопрос сейчас :(

$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

@ получение ошибки с использованием 'Get-ChildItem -Path \\? \ D:' ИЛИ 'Get-ChildItem -Path \\? \ D: \ temp' ИЛИ' Get-ChildItem -Path \\? \ D: 'OR" \\? \ $ Path " –

+0

Хмм, get-childitem не поддерживает его. Используйте класс IO: '$ backupfiles = ([IO.DirectoryInfo]" \\? \ $ Path "). GetFiles ('*', [IO.SearchOption] :: AllDirectories)' – wOxxOm

+0

@wOxxOm Хорошо, я согласен, мои навыки слишком ограничены. IO_CLASS с полным синтаксисом командной строки, над моей головой :), в то время я продолжу пробовать традиционные методы .... –

ответ

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" 
    } 
} 

UNTESTED ...

+0

Ошибка ниже 'PS D: \>. \ Test.ps1 Get-ChildItem: Невозможно найти параметр, соответствующий параметру name 'Direct ory'. В D: \ test.ps1: 1 char: 36 + Get-ChildItem 'D: \ USERS' -Directory <<<< | ForEach-Object { + CategoryInfo: InvalidArgument: (:) [Get-ChildItem], ParameterB indingException + FullyQualifiedErrorId: NamedParameterNotFound, Microsoft.PowerShell.Comm ands.GetChildItemCommand' –

+0

О, вы используете PowerShell версии 2.0, это должно быть 'Get-ChildItem 'D: \ USERS' | Где {$ _. PsIsContainer} | 'Хотя, я вижу, у вас проблемы с длинными путями, и этот скрипт ничего не сделает по этому поводу. – TessellatingHeckler

+0

Хорошо, это сработало. большое спасибо за усилия времени n. оцените это :) теперь просто стучал головой о том, как преодолеть проблему длинного пути :) kinda застрял с ней ... –

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», и, наконец, отображает полный путь + имя отфильтрованных каталогов и условную строку на основе последнего времени записи папки

+1

Это хороший тест, получивший LastWriteTime самой папки AUTOBACKUP? Кажется, обновляется, если файл создается внутри папки, но не если файл создается внутри подпапок ...? – TessellatingHeckler

+0

команда должна содержать каждую папку/подпапку/файлы внутри папки автоматического резервного копирования, если она не обнаружит обновленного файла (не написана с прошлого месяца), тогда он должен предупредить. я думаю, это нормально? –

+0

@Luca Clavarino, получение этой ошибки, ошибка длинного пути 'Get-ChildItem: указанный путь, имя файла или оба они слишком длинны. Полноценное имя файла должно быть менее 260 символов, а имя каталога mu s - менее 248 символов. В строке: 1 char: 14 ' –

Смежные вопросы