1. Главная
  2. Библиотека
  3. Программирование
  4. Написать 2 скрипта в Windows PowerShell: Первый скрипт...
Решение задачи на тему

Написать 2 скрипта в Windows PowerShell: Первый скрипт запрашивает у пользователя две папки(с помощью всплывающих окон): одну для отслеживания изменений, другую для хранения архивов. Затем он создает задание в планировщике задач, которое будет запускать

  • Программирование
  • #Технологии программирования в различных средах
  • #Разработка и тестирование программного обеспечения
Написать 2 скрипта в Windows PowerShell: Первый скрипт запрашивает у пользователя две папки(с помощью всплывающих окон): одну для отслеживания изменений, другую для хранения архивов. Затем он создает задание в планировщике задач, которое будет запускать

Условие:

Написать 2 скрипта в Windows PowerShell:

Первый скрипт запрашивает у пользователя две папки(с помощью всплывающих окон): одну для отслеживания изменений, другую для хранения архивов. Затем он создает задание в планировщике задач, которое будет запускать второй скрипт каждый день в полночь.

Второй скрипт, когда его вызывает планировщик задач, выполняет следующие шаги:
Сканирует указанные пользователем папки на наличие файлов, которые были изменены за последние семь дней.
Если такие файлы найдены, они архивируются в ZIP-файл с текущей датой.
Старые архивы (старше 30 дней) удаляются из папки хранения архивов.

Решение:

Ниже приведено пошаговое решение задачи, включая два скрипта для Windows PowerShell. Каждый шаг описывает, что и зачем делается.

Шаг 1. Скрипт №1

Цель: • Запросить у пользователя две папки через всплывающее окно (одну – для отслеживания, другую – для хранения архивов). • Сохранить выбранные пути в конфигурационном файле (например, config.txt), чтобы второй скрипт знал, где брать информацию. • Создать задание ...

$folderDialog = New-Object System.Windows.Forms.FolderBrowserDialog $folderDialog.Description = Выберите папку для отслеживания изменений if ($folderDialog.ShowDialog() -eq OK) { $monitorFolder = $folderDialog.SelectedPath } else { Write-Host Папка не выбрана. Выход. exit }

$folderDialog.Description = Выберите папку для хранения архивов if ($folderDialog.ShowDialog() -eq OK) { $archiveFolder = $folderDialog.SelectedPath } else { Write-Host Папка не выбрана. Выход. exit }

$configFile = $PSScriptRoot\config.txt MonitorFolder=$monitorFolder | Out-File $configFile -Encoding utf8 ArchiveFolder=$archiveFolder | Out-File $configFile -Append -Encoding utf8

$taskName = ArchiveScriptTask $script2Path = $PSScriptRoot\Script2.ps1 $action = New-ScheduledTaskAction -Execute powershell.exe -Argument -NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File $trigger = New-ScheduledTaskTrigger -Daily -At 00:00 Register-ScheduledTask -Action $action -Trigger $trigger -TaskName $taskName -Description Запуск архивации файлов -User $env:USERNAME -RunLevel Highest

Write-Host Задание создано и конфигурационный файл сохранён: $configFile

Пояснения: • $PSScriptRoot – переменная, содержащая путь к папке, в которой находится скрипт. Это позволяет корректно сохранять конфигурационный файл и запускать второй скрипт. • Register-ScheduledTask создаёт задачу с указанными действием (action) и триггером (trigger). Здесь используется пользователь, от имени которого запущен скрипт. • Параметры -NoProfile и -ExecutionPolicy Bypass гарантируют, что скрипт будет выполнен без влияния пользовательских настроек.

Шаг 2. Скрипт №2

Цель: • При запуске планировщиком прочитать конфигурационный файл, из которого узнать папку для отслеживания и папку для архивов. • Найти файлы в папке для отслеживания, которые были изменены за последние 7 дней. • Если такие файлы обнаружены, создать ZIP-архив, в имя которого включена текущая дата, и сохранить архив в папке для архивов. • Удалить из папки архивов старые архивы (старше 30 дней).

Реализация:

  1. В начале скрипта читаем конфигурационный файл (config.txt), который содержит строки вида MonitorFolder=путь и ArchiveFolder=путь.
  2. Проверяем, существуют ли указанные папки. Если нет – прекращаем выполнение.
  3. Используем команду Get-ChildItem с параметром -Recurse для поиска всех файлов в папке отслеживания.
  4. Фильтруем файлы по дате LastWriteTime. Выбираем те, у которых время изменения не раньше, чем текущая дата минус 7 дней.
  5. Если подходящие файлы найдены, формируем имя архива с текущей датой (например, ArchiveYYY-MM-DD.zip) и с помощью команды Compress-Archive архивируем найденные файлы.
  6. Далее с помощью Get-ChildItem получаем все ZIP-файлы из папки архивов и удаляем те, у которых дата изменения (LastWriteTime) старше 30 дней.

Ниже содержимое Скрипта №2 (например, Script2.ps1):


$configFile = $PSScriptRoot\config.txt if (!(Test-Path $configFile)) { Write-Host Конфигурационный файл не найден: $configFile exit } $lines = Get-Content $configFile monitorFolder=(monitorFolder = (lines | Where-Object { $_ -like MonitorFolder=* }) -replace MonitorFolder=, archiveFolder=(archiveFolder = (lines | Where-Object { $_ -like ArchiveFolder=* }) -replace ArchiveFolder=,

if (-not (Test-Path $monitorFolder)) { Write-Host Папка для отслеживания не существует: $monitorFolder exit } if (-not (Test-Path $archiveFolder)) { Write-Host Папка для хранения архивов не существует: $archiveFolder exit }

$cutoffDate = (Get-Date).AddDays(-7) $files = Get-ChildItem -Path $monitorFolder -Recurse -File | Where-Object { $_.LastWriteTime -ge $cutoffDate }

if ($files.Count -gt 0) {

Формирование имени архива с текущей датой

$currentDate = (Get-Date -Format yyyy-MM-dd) zipFile = Join-Path $archiveFolder Archive_currentDate.zip Compress-Archive -Path $files.FullName -DestinationPath $zipFile -Force Write-Host Создан архив: $zipFile } else { Write-Host Нет файлов, изменённых за последние 7 дней для архивации. }

$archiveCutoff = (Get-Date).AddDays(-30) $oldArchives = Get-ChildItem -Path $archiveFolder -Filter *.zip | Where-Object { $_.LastWriteTime -lt $archiveCutoff } foreach ($archive in $oldArchives) { Remove-Item $archive.FullName -Force Write-Host Удалён архив: ((archive.FullName) }

Пояснения: • В начале скрипта проверяется наличие конфигурационного файла, из которого извлекаются папки для мониторинга и архивов. • Использование Get-ChildItem с -Recurse позволяет искать файлы во всех вложенных папках. • Compress-Archive создаёт архив на основе списка файлов. Параметр -Force позволяет перезаписать существующий архив с таким же именем. • При удалении старых архивов фильтруются файлы по дате LastWriteTime. Если архив был изменён (то есть создан) более 30 дней назад, он удаляется.

Итоговое замечание: После сохранения обоих скриптов (например, в одной папке), сначала запускаем скрипт Script1.ps1 – он попросит указать нужные папки и создаст задание в планировщике задач. Затем планировщик будет ежедневно вызывать Script2.ps1, который выполнит архивирование изменений и очистку старых архивов.

Не нашел нужную задачу?

Воспользуйся поиском

Выбери предмет