Перейти к основному содержимому

Автоматизация — AutoHotkey, PowerShell и планировщик

Опытному пользователю
Теория и правила

Когда автоматизировать, идемпотентность, бэкапы — в скриптах и локальной автоматизации. Здесь — конкретные программы.


AutoHotkey (Windows)

AutoHotkey — классика макросов Windows — горячие клавиши, автоклик только там, где вы сами разрешили, переназначение, скрипты окон.

ВозможностьПример
Hotkey^!n → запуск блокнота
Текстовые шаблоны::btw:: → "кстати, "
Управление окнамиАктивировать VS Code на втором мониторе

Осторожно с автокликерами в онлайн-играх и сервисах — бан аккаунта. Для рутины в своих приложениях — нормальная практика.

Документация: autohotkey.com. Обзор в tools/automation.

Сохраните скрипт как power-user.ahk и запустите (или положите в автозагрузку):

; Win+Alt+D — папка Downloads
#!d::
{
Run 'explorer.exe ' A_UserProfile '\Downloads'
}

; Текстовое сокращение
::addr::123456, City, Street 1

; Win+Alt+C — активировать VS Code, если уже запущен
#!c::WinActivate 'ahk_exe Code.exe'

PowerShell и Python

СредаУстановкаРаздел
PowerShell 7+winget install Microsoft.PowerShell5.26 PowerShell
Python 3python.org / winget5.02 Python
Windows TerminalОбъединяет вкладки PS, WSL, SSH2.05 Терминал

Power Automate Desktop

Визуальные сценарии "кликни сюда — считай текст" без кода. Плюс: быстрый прототип. Минус: хрупкость при смене UI. Хорош для редких GUI-процедур, где AHK избыточен.


Планировщик заданий Windows

taskschd.msc — запуск скриптов по расписанию, при входе, при простое. Связывайте с .ps1 и .py из советов по автоматизации.


n8n, Node-RED

Визуальные workflow на своём NAS/ПК — webhook → Telegram, мониторинг RSS, умный дом. Тяжелее AHK, но нагляднее для цепочек "если — то". Запуск в Docker на Home Lab.


Сравнение инструментов GUI-автоматизации

ИнструментКодКриваяВерсии в Git
AutoHotkeyДаСредняя.ahk отлично
Power Automate DesktopНетНизкаяПлохо
AutoItДаСредняяРедко
Sikuli (устар.)КартинкиВысокаяХрупко

Определение автоматизации

Автоматизация представляет собой замену ручного выполнения действий программным управлением. Этот подход переводит повторяющиеся операции в режим автономного или полуавтономного выполнения. Автоматизация позволяет выполнять задачи быстрее, надёжнее и с меньшим количеством ошибок по сравнению с ручной обработкой.

Информационные системы используют автоматизацию для обработки данных, управления конфигурациями, координации компонентов и обеспечения соблюдения регламентов. Программное управление устраняет необходимость человеческого участия в однотипных операциях и освобождает ресурсы для решения более сложных задач.


Основные характеристики автоматизации

ХарактеристикаОписание
ПовторяемостьДействия выполняются многократно без изменений
ПредсказуемостьВходные данные приводят к ожидаемым результатам
ФормализуемостьПравила выполнения описаны чётко и однозначно
МасштабируемостьСценарий работает при увеличении объёма данных
ВоспроизводимостьРезультат остаётся неизменным при повторном запуске

Что такое скрипт

Скрипт представляет собой программу написанную на языке программирования высокого уровня. Скрипты выполняют последовательность инструкций, которые интерпретируются специальной средой выполнения. Каждый скрипт содержит набор команд, определённый порядок их выполнения и условия ветвления.

Языки скриптов обеспечивают доступ к операционной системе, сетевым ресурсам, файловой структуре и внешним API. Интерпретатор выполняет код скрипта пошагово, не требуя стадии компиляции как в случае традиционных приложений.


Распространённые языки скриптинга

ЯзыкОбласть примененияПримеры использования
PowerShellУправление WindowsАдминистрирование систем, работа с реестром, управление Azure
BashУправление Unix/LinuxУстановка пакетов, настройка окружения, обработка файлов
PythonУниверсальная автоматизацияРабота с данными, веб-сервисы, анализ информации
JavaScript/Node.jsВеб-автоматизацияПарсинг сайтов, тестирование API, серверные задачи
Power AutomateLow-code решениеВизуальное создание потоков, интеграция сервисов Microsoft

Структура типичного скрипта

# Определение переменных
$targetPath = "C:\Backup\Documents"
$dateString = Get-Date -Format "yyyy-MM-dd"
$outputFile = "$($targetPath)\backup_$dateString.zip"

# Проверка наличия целевой директории
if (!(Test-Path $targetPath)) {
Write-Host "Ошибка: целевая папка не найдена"
exit 1
}

# Создание архива
Compress-Archive -Path "$($targetPath)\*" -DestinationPath $outputFile

# Проверка результата
$size = (Get-Item $outputFile).Length
Write-Host "Архив создан размером $($size / 1MB) МБ"

Компоненты скриптов

Переменные. Хранят данные между этапами выполнения. Переименование переменной происходит через присвоение нового значения. Пример: $userName = "Alex" создаёт переменную userName со значением "Alex".

Конструкции условного перехода. Определяют разные пути выполнения кода в зависимости от условий. Инструкция if-else проверяет условие и выбирает блок кода для исполнения. Инструкция switch выбирает блок по значению переменной.

Циклы. Выполняют один и тот же блок кода многократно подряд. Конструкция for выполняется фиксированное число раз. Конструкция while повторяется до изменения условия. Конструкция foreach проходит по коллекции элементов.

Функции. Инкапсулируют логику в переиспользуемый блок кода. Функция принимает параметры, выполняет действия и возвращает результат. Декларация функции начинается с ключевого слова function.

Обработка исключений. Обнаруживают и обрабатывают ошибки выполнения. Блок try содержит потенциально опасный код. Блок catch исполняется при возникновении исключения. Блок finally всегда выполняется независимо от результата.


Классификация автоматизируемых задач

Атомарные операции

Атомарные операции представляют одиночные действия выполнимые за одно обращение к системе. Каждая такая операция завершается полностью или не выполняется вовсе. Операции характеризуются детерминированным результатом одинаковый при одинаковых входных данных.

Тип операцииПримерИнструмент
Файловые операцииКопирование файлаCopy-Item
Сетевые запросыHTTP GET запросInvoke-RestMethod
Системные вызовыПерезапуск службыRestart-Service
Запись в базуINSERT командаsqlcmd
ЛогинованиеЗапись строки в файлAdd-Content

Пример автоматизации копирования файлов:

#!/bin/bash
# Bash скрипт для резервного копирования

SOURCE="/home/user/documents"
DEST="/backup/documents"
DATE=$(date +%Y%m%d)

mkdir -p "$DEST"
cp -r "$SOURCE/" "$DEST/doc_$DATE"

if [ $? -eq 0 ]; then
echo "Резервная копия успешно создана" >> /var/log/backup.log
else
echo "Ошибка создания резервной копии" >> /var/log/backup.log
fi

Последовательные сценарии

Последовательные сценарии выполняют действия строго друг за другом. Результат одного шага становится входом для следующего шага. Такая структура характерна для ETL процессов (Extract–Transform–Load).

ЭтапДействиеДанные
ИзвлечениеПолучение данных из источникаCSV, API, База данных
ТрансформацияОчистка и форматированиеJSON, XML, Строки
ЗагрузкаПомещение в целевую системуТаблица, Файл, Хранилище

Пример Power Automate потока:

Триггер: Получено новое письмо

Извлечь отправителя и тему

Проверить наличие ключевого слова
↓ (Да)
Записать информацию в SharePoint

Отправить уведомление в Teams

Завершить выполнение

Процессы с ожиданием

Процессы с ожиданием включают этапы зависящие от внешних событий или решений людей. Процесс может находиться в состоянии ожидания часы дни или недели. Система сохраняет состояние экземпляра процесса для продолжения выполнения после события.

Элементы процесса с ожиданием:

События. Маркеры начала или окончания этапов процесса. Событие "Получение оплаты" запускает следующий этап. Событие "Истечение срока" активирует альтернативный путь выполнения.

Ожидание ввода. Шаги требующие вмешательства человека. Форма предоставляет интерфейс для заполнения необходимых данных. Задача назначается конкретному пользователю системы.

Таймеры. Автоматический переход при наступлении времени. Таймер запускает событие через заданный интервал. Превышение таймера приводит к эскалации или изменению статуса.


Адаптивные процессы

Адаптивные процессы меняют логику выполнения динамически на основе контекста. Маршрут процесса зависит от текущих данных состояния системы и внешних факторов. Реализация требует правил оценки и принятия решений.

Пример маршрутизации обращения:

КатегорияПриоритетМаршрут
VIPВысокийУскоренное согласование
СтандартОбычныйСтандартная очередь
ТехническийСреднийИТ поддержка
ФинансовыйНизкийБухгалтерия

Примеры автоматизации

Резервное копирование данных

Скрипт автоматически создаёт архивы директорий с датами версионирования. Пользователь задаёт расписание запуска один раз скрипт продолжает работу самостоятельно.

# PowerShell скрипт резервного копирования

param(
[string]$SourcePath = "D:\Данные",
[string]$BackupPath = "E:\Backups",
[int]$KeepDays = 30
)

$today = Get-Date -Format "yyyyMMdd"
$backupFile = Join-Path $BackupPath "backup_$today.zip"

# Проверка пространства на диске
$freeSpace = (Get-PSDrive E).Free
$sourceSize = (Get-ChildItem -Path $SourcePath -Recurse -Force).Length

if ($sourceSize -gt $freeSpace) {
throw "Недостаточно места для резервного копирования"
}

# Создание архива
Compress-Archive -Path "$SourcePath\*" -DestinationPath $backupFile -Force

# Удаление старых бэкапов
Get-ChildItem -Path $BackupPath -Filter "backup_*.zip" |
Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-$KeepDays) } |
Remove-Item

# Логирование
$logEntry = "$(Get-Date) — Архив создан: $(($backupFile | Split-Path) | Measure-Object)"
Add-Content -Path "C:\Logs\backup.log" -Value $logEntry

Мониторинг систем

Скрипт периодически проверяет доступность критических сервисов и отправляет уведомления при сбоях.

#!/usr/bin/env python3

import socket
import urllib.request

def check_http(url: str, timeout: float = 10) -> bool:
try:
with urllib.request.urlopen(url, timeout=timeout) as r:
return 200 <= r.status < 300
except OSError:
return False

def check_tcp(host: str, port: int, timeout: float = 3) -> bool:
try:
with socket.create_connection((host, port), timeout=timeout):
return True
except OSError:
return False

checks = [
("Web", lambda: check_http("http://127.0.0.1/")),
("MySQL", lambda: check_tcp("127.0.0.1", 3306)),
]

for name, fn in checks:
print(f"{name}: {'OK' if fn() else 'FAIL'}")

Для HTTP подойдёт и requests; для TCP requests.get("tcp://...") не работает — нужен сокет или Test-NetConnection в PowerShell.


Автообработка заявок

Поток автоматически перерабатывает входящие заявки и направляет их нужным специалистам.

ШагДействиеРезультат
1Получение заявки из формыДанные заявки в переменной
2Валидация обязательных полейСтатус "В обработке"
3Проверка категорийВыбор отдела назначения
4Создание задачи в системеID задачи в ответе
5Уведомление заявителяПисьмо подтверждение

Инструменты планирования

Планировщик задач Windows (Task Scheduler)

Планировщик заданий Windows обеспечивает запуск скриптов по расписанию. Пользователь создаёт задачу указывает программу или скрипт устанавливает триггеры и настройки безопасности.

Компоненты задачи:

Триггеры. Определяют время и частоту запуска. Триггер "При запуске" срабатывает при старте системы. Триггер "По расписанию" запускает по графику. Триггер "При событии" реагирует на системные события.

Действия. Указывают команду для выполнения. Действие запускает exe файл или скрипт. Параметры команды передаются через поле "Добавить аргументы".

Условия. Настройка запуска по условиям среды. Условие "Начинать только если подключено питание" пропускает задачу при работе от батареи. Условие "Разблокировать сеть" требует подключения к интернету.

Настройки доступа. Учётная запись под которой выполняется задача. Учетная запись с правами администратора открывает доступ к защищённым ресурсам. Разрешение "Выполнять только если пользователь вошёл" гарантирует корректное взаимодействие с интерфейсом.


Планировщик cron

Cron в Unix и Linux запускает команды по расписанию. Редактирование — crontab -e; каждая непустая строка (кроме комментариев #) — отдельная задача. Подробная шпаргалка — Планирование и автоматизация задач.

Структура строки cron:

ПолеЗначенияОписание
Минута0–59Время минуты запуска
Час0–23Время часа запуска
День месяца1–31Номер дня месяца
Месяц1–12Номер месяца
День недели0–6День недели (0 = воскресенье)

Операторы: * — любое значение; */n — каждые n единиц (например */5 в минутах); , и - — список и диапазон. Алиасы @daily, @weekly, @hourly, @reboot заменяют пять полей (см. статью по ссылке выше).

Примеры:

# Каждые 5 минут
*/5 * * * * /usr/local/bin/check.sh

# Ежедневное резервное копирование в 03:00
0 3 * * * /usr/local/bin/backup.sh

# Еженедельная очистка — понедельник в 04:00
0 4 * * 1 /usr/local/bin/cleanup.sh

# Ежеквартальный отчёт — 1-е, 15-е и 30-е число в квартальных месяцах в 08:00
0 8 1,15,30 */3 * /usr/local/bin/report.sh

Система systemd timers

Systemd timers заменяют cron в современных Linux дистрибутивах. Конфигурация разделена на два файла единицу задания и таймер. Это упрощает логирование и управление зависимостями.

Файл услуги .service:

[Unit]
Description=Script backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=backup

[Install]
WantedBy=multi-user.target

Файл таймера .timer:

[Unit]
Description=Daily backup timer

[Timer]
OnCalendar=daily
Persistent=true
Unit=backup.service

[Install]
WantedBy=timers.target

Принципы построения надёжных сценариев

Обработка исключений

Каждый скрипт должен предусматривать возможные ошибки выполнения. Код проверяет успешность операций и предпринимает соответствующие действия при неудаче. Логи содержат полную информацию для диагностики проблем.


import subprocess

try:
result = subprocess.run(["command", "argument"], capture_output=True, text=True)
if result.returncode != 0:
print(f"Ошибка выполнения: {result.stderr}")
except FileNotFoundError:
print("Команда не найдена в системе")
except Exception as e:
print(f"Неожиданная ошибка: {e}")

Повторные попытки

Операции с сетью базами данных и внешними сервисами подвержены временным сбоям. Система делает несколько попыток с экспоненциальной задержкой между ними. Это повышает вероятность успешного завершения при краткосрочных проблемах.


import time

def execute_with_retry(func, max_attempts=3, delay_factor=2):
attempt = 0
while attempt < max_attempts:
try:
return func()
except TemporaryError:
attempt += 1
if attempt >= max_attempts:
raise
time.sleep(delay_factor ** attempt)

Идемпотентность

Идемпотентная операция даёт одинаковый результат при повторном выполнении. Это защищает от дублирования данных при сбоях и перезапусках. Для достижения идемпотентности используются уникальные идентификаторы проверки существования перед выполнением действия.

-- Идемпотентная операция вставки
INSERT INTO users (id, name)
VALUES (123, 'Alex')
ON CONFLICT (id) DO NOTHING;

Валидация данных

Скрипт проверяет соответствие входных данных формату требованиям. Проверки происходят до выполнения операций чтобы избежать ненужных расходов ресурсов. Неудовлетворительные данные вызывают немедленный отказ выполнения с понятным сообщением об ошибке.

from datetime import datetime

def validate_date(date_string):
pattern = "%Y-%m-%d"
try:
datetime.strptime(date_string, pattern)
return True
except ValueError:
return False

Интеграция с системами

Работа с базами данных

Подключение к базе данных осуществляется через драйверы обеспечивающие SQL коммуникацию. Скрипт загружает credentials безопасно использует пулы соединений. Результаты запросов обрабатываются выборочно транзакции поддерживают целостность.


import psycopg2

conn = psycopg2.connect(
host="localhost",
database="mydb",
user="user",
password="***"
)
cursor = conn.cursor()
cursor.execute("SELECT id, name FROM users WHERE active = true")
results = cursor.fetchall()
cursor.close()
conn.close()

REST API взаимодействия

REST API предоставляют стандартизированный способ обмена данными между системами. Скрипт формирует запросы с необходимыми параметрами заголовками и телом. Сервер возвращает статус ответа и тело с данными. Обработка статусов позволяет реагировать на успех или ошибку.


import requests

response = requests.post(
"https://api.example.com/data",
json={"key": "value"},
headers={"Authorization": "Bearer token"}
)
status = response.json()

Работа с файлами

Файловая система предоставляет хранилище данных структурированное организацией. Скрипт читает файлы в текстовом или бинарном формате записывает результаты в новые файлы. Управление директориями включает создание удаление поиск файлов по маскам.

with open("input.txt", "r", encoding="utf-8") as f:
lines = f.readlines()

for line in lines:
processed = line.upper()
with open("output.txt", "a", encoding="utf-8") as out:
out.write(processed)

Под капотом — хуки, задачи и права

AutoHotkey вешает низкоуровневые хуки клавиатуры/мыши (Windows): скрипт .ahk → интерпретатор → перехват → ваша команда (вставить текст, запустить exe). Требует доверия: AHK видит ввод глобально.

Планировщик заданий запускает процесс в выбранной учётной записи; "выполнять с наивысшими правами" — UAC bypass для админ-скриптов. Триггер по расписанию → Task Scheduler → svchost → ваш powershell.exe.

Задача "каждую ночь". Бэкап через Планировщик дважды запустился (дублировали триггер "при простое" и "в 03:00") — диск забился копиями. Один триггер + лог robocopy /LOG.

n8n / Node-RED — визуальные графы узлов; под капотом Node.js, HTTP-вызовы, очереди. Удобны для "если письмо — то Telegram", без GUI-автоматизации Windows.


Опыт, мнение и истории

AHK для раскладки. Одна горячая клавиша переключает EN/RU — спасение на старом софте без переключателя. Скрипт на 15 строк; храню в Git.

Задача "каждую ночь". Бэкап через Планировщик дважды запустился (дублировали триггер "при простое" и "в 03:00") — диск забился копиями. Один триггер + лог robocopy /LOG.

Power Automate Desktop. Записал клики по legacy-приложению — сломалось после обновления UI. Для нестабильного интерфейса надёжнее API или PowerShell, чем запись мыши.

Мнение. Автоматизация окупается на повторяющихся действиях (бэкап, отчёт, переименование). Разовую задачу быстрее сделать руками, чем три часа отлаживать скрипт.


Содержание