![]() |
[решено] скрипт для выявления невыполненных ежедневных бэкапов
Друзья, помогите решить проблему, не могу сделать правильный вывод данных. Как вывести только названия тех папок, где не существуют файлы, которые будут заданы в условие (к примеру $_.LastWriteTime не являются вчерашней датой). Заранее спасибо.
|
Как пример,найти все папки в которых нет файлов,измененных сегодня:
Код:
Get-ChildItem D:\Temp -Recurse | Where {$_.PsIsContainer} | Код:
Get-ChildItem D:\Temp -Recurse -Directory | |
Спасибо, все отлично отработало. Еще малюсенький вопрос: Я делаю вывод в таблицу "Format-Table -auto FullName, Length, LastWriteTime", а как мне вывести "Length" в мегабайтах, а не в байтах?
|
Format-Table -auto FullName, @{n="Length(MB)";e={"{0:N2}" -f ($_.Length/1mb)}}, LastWriteTime
|
Здорово! И последний вопрос:
Вот код: Код:
$Days = "-1" Код:
$EmailFrom = "test@test.ru" |
Для начала разберитесь с логикой, а то тут странно получается:
1) Проверяем каталоги на условие 2) Если удовлетворяет условию, выводим каталоги 3) Не удовлетворяет условию,выводим -"Файлы за $Yesterday" 4) Получаем список файлов в пути,которых есть $YesterdayF 5) Если удовлетворяет условию,выводим "Каталоги с не обновленными файлами" и файлы Зачем дважды гонять не быструю операцию,как Get-ChildItem -Path $Path -Recurse,проще сохранить результат один раз в переменную и в дальнейшем уже использовать. |
Так как с PowerShell знаком только третий день, то мне самому сложно понять как это сделать ;)
Когда сохраняю весь результат в переменную и подставляю ее в $Body, то тело письма содержит весь код, а не результат. Как сделать правильно? |
Будь по-вашему.
Код:
$NotExist = Get-ChildItem -Path $Path -Recurse | Where-Object {$_.PsIsContainer} | Where-Object {!($_.GetFiles()| Where-Object {$_.LastWriteTime -lt $Yesterday})} | Format-Table FullName, LastWriteTime |
Не вышло. Сформировалось письмо следующего соодержания:
Код:
Microsoft.PowerShell.Commands.Internal.Format.FormatStartData Microsoft.PowerShell.Commands.Internal.Format.GroupStartData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.GroupEndData Microsoft.PowerShell.Commands.Internal.Format.FormatEndData |
Скопируйте правильно,что я привел,там этой не возникает таких проблем и весь вывод в переменной $Body
|
Спасибо, велики Гуру! +++++ тебе в карму ;)
|
Я, наверное, очень сильно замучил тебя, но возникла еще одна потребность...
А можно как-то используя форматирование (Format-Table) вывести название папок в столбике отдельно? Т.е. чтобы помимо имени файла и размера (Format Table Name, Length) было еще название папки в которой лежат файлы? :) |
Добавить свойство DirectoryName.
|
Здорово. А можно как-то сократить? А то выводит, например: "C:\Temp\1\2\", а надо только "2".
|
Format Table Name, Length, @{n="Parent";e={$_.Directory.Name}}
|
Все отлично отработало. Спасибо!
Жаль только что в письме или если выводить в файл, то вся таблица кривая становится, видимо это из за шрифтов. Есть какое-нибудь гуманное решение может быть? |
rudimko, использовать моноширинный шрифт или делать вывод в таблице (для html).
|
Сделал вывод в таблицах HTML, все получилось. Теперь встала другая задача для усовершенствования скрипта.
Для начала распишу для чего все это делается и как: 1. Скрипт предназначен для выявления проблем хранения бэкапов - находит файлы по маске созданные за вчерашний день - находит каталоги в которых по маске не созданы файлы за вчерашний день - записывает результаты в переменную и отправляет на эл. ящик 2. Сам скрипт: Теперь о модификации: 1. Возникла мысль все переделать так, чтобы в другую переменную заносились данные еще и за позавчерашний день по аналогии (файлы хранятся там же) и потом нужно сделать сравнение двух переменных (за вчерашний день и за позавчерашний день) по их свойствам. Результат нужно вывести в единую таблицу и потом отправлять по почте. Сравнение: 1. Размер файла (если он уменьшился на 0.5мб, то нужно как-то это отметить в таблице, например поставить воскл. знак в сл. столбце) 2. Если нет файла за вчера, выводит в строку за позавчера и так же воскл. знак в сл. графе В общем задумка примерно такая, но не знаю как ее реализовать и возможно ли это вообще... Буду всем признателен, кто поможет в разработке данного скрипта. Спасибо заранее. |
Почему-то выдает ошибку после Out-Strng:
Отсутствует закрывающая "}" в блоке инструкций. строка:15 знак:1 + <<<< ) | Out-String + CategoryInfo : ParserError: (CloseBraceToken:TokenId) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : MissingEndCurlyBrace |
Должно быть Out-String.
|
там именно Out-String, опечатался в предыдущем сообщении...
Возможно нужен 3-й PowerShell? Пробую на 2-й версии |
Не требуется PowerShell V3,тут скобка пропущена:
Код:
$Body = @( |
Спасибо!
|
Скобка не там пропущена, прошу прощения, неверно код вставил. Скобка пропущена в самом конце первого условия, на строчку выше второго условия.
Вот верный кусок: Код:
### Условие: если нет указанных файлов по заданному фильтру - выводит в таблицу каталог где их нет ### |
Еще раз о крике помощи
Имеем допотопный скрипт, который ищет файлы в каталогах по маске (за вчерашний день и за позавчерашний день): Код:
$Date = Get-Date Код:
$Exist | Sort-Object -Property $_.Name | Format-Table @{Label="Каталог";e={$_.Directory.Name}}, @{Label="Имя";e={$_.Name}}, @{Label="Размер";e={"{0:N3}" -f ($_.Length/1mb)}} Цитата:
1. Каталог 2. Имя файла (вчерашний файл, если его нет, тогда позавчерашний) 3. Размер Позавчерашнего файла если он есть) 4. Размер Вчерашнего файла (если он есть) 5. Вывод отметок по условиям (ставить ОК: если имеется вчерашний файл и его размер не равен 0, если есть позавчерашний и вчерашний; ставить FAIL: если есть позавчерашний файл, а вчерашнего нет, если вчерашний файл меньше по размеру чем позавчерашний) Пример выходной таблички: Цитата:
|
Код:
$Date = Get-Date |
Время: 20:24. |
Время: 20:24.
© OSzone.net 2001-