понедельник, 1 декабря 2014 г.

Скрипт PowerShell, отслеживающий свободное место на диске и удаляющий старые файлы.

Решил освоить PowerShell. Подвернулась подходящая задача - необходимо настроить на сервере очистку жесткого диска в зависимости от свободного места. Будем удалить старые файлы в определенном каталоге (старые бэкапы).

Скрипт:

$d = "d:\1" // объявляю переменную, в данном случае путь к каталогу
cd $d // перехожу в каталог
psdrive | ForEach-Object {if ($_.free -gt 10000000000 -and $_.name -eq "d"){ls $d | Sort-Object LastWriteTime -descending | select LastWriteTime, name -last 2| ForEach-Object {Remove-item $_.name -whatif}}} //  см. ниже

// psdrive - показать все диски
// | - передать данные дальше по конвееру
// ForEach-Object - перебираем диски по порядку
// if ($_.free -gt 10000000000 -and $_.name -eq "d") - находим диск D, у которого меньше 10Gb
// ls $d - (ls, dir в данном случае псевдонимы основной команды get-childitem) получаем список файлов и каталогов внутри данного
// Sort-Object LastWriteTime -descending - сортируем объекты по времени последнего изменения в обратном понятке
// select LastWriteTime, name -last 2 - выбираем последнии две записи, выводим поля время и имя
// Remove-item $_.name - удаляем файлы с этими именами
// -whatif - симулируем данный скрипт для проверки

Данный скрипт сохранил с расширением .ps1. Запуск данного файла осуществляю через .bat файл с таким содержимым:

powershell.exe d:\psdrive01.ps1

Файл с расширением .bat запускаю через планировщик заданий.

Есть еще один нюанс при запуске. По умолчанию выполнение сценариев PowerShell в системе запрещено. Т.к. в скриптах может находится вредоносный код, который может нанести вред системе. По соображениям безопасности скрипты PowerShell должны быть подписаны цифровой подписью, такой подход называется политика выполнения. new 6 Notepad 2011 06 08 15 29 19 thumb PowerShell. Выполнение скриптов запрещено для данной системы
Для тестирования скриптов можно отключить проверку выполнения для локальный скриптов. Для этого запускаем консоль PowerShell от имени администратора и вводим команду:
Set-ExecutionPolicy RemoteSigned
new 6 Notepad 2011 06 08 15 30 08 thumb PowerShell. Выполнение скриптов запрещено для данной системы

Подтверждаем изменение политики выполнения – [Y] Да.
Теперь все ЛОКАЛЬНЫЕ сценарии PowerShell будут выполняться без подписи и сценарий загруженные из интернета с цифровой подписью надежного издателя.