Найдите самый старый файл в каждом подкаталоге с помощью Powershell - PullRequest
0 голосов
/ 07 мая 2019

Моя компания недавно перешла на outlook365.Мы полностью основаны на VDI, поэтому наши профили пользователей хранятся на одном сервере.В результате все наши пользователи теперь имеют более 2 OST-файлов, занимающих место на сервере.Я хотел бы написать скрипт для поиска и удаления посторонних OST-файлов.Кроме того, я хотел бы запланировать запуск сценария на ежемесячной основе, чтобы очистить любые потерянные OST-файлы, возникающие по любой другой причине.

Я пробовал несколько разных решений, но не могу найти правильный синтаксис для идентификации только самого старого / оригинального .ost в каждом подкаталоге, все попытки идентифицировали самый старый файлиз всего каталога или всех OST-файлов в каталоге.

$Path = "<path>" 

$SubFolders = dir $Path -Recurse | Where-Object {$_.PSIsContainer} | ForEach-Object -Process {$_.FullName}

ForEach ($Folder in $SubFolders)
    {
    $FullFileName = dir $Folder | Where-Object {!$_.PSIsContainer} | Sort-Object {$_.LastWriteTime} -Descending | Select-Object -First 1     
    }

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Этот вкладыш должен выполнять свою работу, сохраняя файл ost с новейшим LastWriteTime

gci -Path $Path -directory | where {(gci -Path $_\*.ost).count -gt 1}|%{gci -Path $_\*.cmd|Sort-Object LastWriteTime -Descending|Select-Object -Skip 1|Remove-Item -WhatIf}

Далее следует более длинный вариант.

$Path = '<path>'
$Ext  = '*.ost'
Get-ChildItem -Path $Path -directory -Recurse | 
  Where-Object {(Get-ChildItem -Path "$_\$Ext" -File -EA 0).Count -gt 1} | 
    ForEach-Object {
      Get-ChildItem -Path "$_\$Ext" -File -EA 0| Sort-Object LastWriteTime -Descending | 
        Select-Object -Skip 1 | Remove-Item -WhatIf
    }

Первые две строки оценивают папки с более чемодин файл .ost Следующие строки перебирают эти папки и сортируют их по убыванию LastWriteTime, пропускают первый (самый новый) и направляют другой в Remove-Item с параметром -WhatIf, чтобы показать только то, что будет удалено во время тестирования.

Конечно, вы также можете переместить их в резервное хранилище.

0 голосов
/ 07 мая 2019

Внутри вашего цикла вы можете использовать следующее, чтобы перечислить OST-файл, который имеет самое старое значение LastWriteTime.Просто добавьте флаг -Descending к Sort-Object, чтобы вывести список самого нового файла.

$FullFileName = foreach ($folder in $Subfolders) {
    $Get-ChildItem -Path $folder -Recurse -File -Filter "*.ost" |
      Sort-Object -Property LastWriteTime |
        Select-Object -Property FullName -First 1
}
$FullFileName

Если в пути $folder найден только один файл .ost, он все равно найдет этот файл.Поэтому вам понадобится логика, чтобы не удалять, когда есть только один файлЭто не гарантирует, что это самый старый файл.Вы, вероятно, хотите комбинацию самого старого CreationTime и самого нового LastWriteTime.Ниже приведен список самого старого файла .ost, основанного на CreationTime.

$FullFileName = foreach ($folder in $Subfolders) {
    Get-ChildItem -Path $folder -Recurse -File -Filter "*.ost" |
          Sort-Object -Property CreationTime |
            Select-Object -Property FullName -First 1
}
$FullFileName

Другая проблема заключается в установке переменной $FullFileName внутри цикла foreach.Это означает, что он будет перезаписываться при каждой итерации циклаПоэтому, если вы получите значение после завершения цикла, оно будет иметь только последнее найденное значение.Установка переменной как результата вывода цикла foreach создаст массив с несколькими значениями.

Чтобы вывести путь к файлу OST только при наличии нескольких файлов OST, вы можете сделать что-то вроде следующего:

$FullFileName = foreach ($folder in $Subfolders) {
    $files = Get-ChildItem -Path $folder -Recurse -File -Filter "*.ost" |
          Sort-Object -Property LastWriteTime -Descending
    if ($files.count -ge 2) {
           $files | Select-Object -Property FullName -First 1
    }
$FullFileName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...