Скрипты, макросы и локальная автоматизация
Что такое скриптовый язык
Скриптовый язык — язык, программы на котором обычно интерпретируются построчно (без отдельной стадии компиляции в .exe). Скрипт удобен для:
- пакетной работы с файлами и папками;
- вызова утилит ОС и API;
- расписания (cron, Планировщик заданий);
- "склеивания" нескольких программ в один сценарий.
От "больших" языков (C++, Java, C#) скрипты отличаются скоростью старта и низким порогом: можно решить задачу за вечер. Для продвинутого пользователя это главный рычаг эффективности.
Скрипт и программа: скрипт обычно запускается интерпретатором (python, pwsh, bash) построчно; программа на C#/Go сначала компилируется в исполняемый файл. Для разовой автоматизации скрипт выигрывает; для тяжёлой логики и распространения "как exe" — компилируемые языки (обзор разработки).
Код выхода — число, которое скрипт возвращает ОС: 0 = успех, ненулевое = ошибка. Планировщик и CI смотрят на него; в PowerShell после внешней команды проверяйте $LASTEXITCODE, в Bash — echo $? сразу после вызова.
Подробнее об экосистемах — Python, Bash, PowerShell. Обзор инструментов — в главе про софт.
Три столпа автоматизации на ПК
| Язык / инструмент | Платформа | Типичные задачи |
|---|---|---|
| PowerShell | Windows (и кроссплатформенный pwsh) | Реестр, службы, AD/Azure, отчёты по системе |
| Bash | Linux, macOS, WSL | Серверы, деплой, cron, пайплайны в терминале — галерея с разбором |
| Python | Везде | Файлы, API, парсинг, боты, мини-утилиты |
Когда что выбрать:
- живёте в Windows и трогаете систему — начните с PowerShell 7+;
- есть WSL или Home Lab на Linux — Bash, практика — однострочники и скрипты;
- нужна библиотека "на всё" (HTTP, Excel, ML) — Python.
Терминал как среда — в разделе Терминал.
Мини-пример — идемпотентный бэкап (PowerShell)
$Source = 'D:\Projects'
$Dest = "D:\Backup\projects_$(Get-Date -Format yyyyMMdd).zip"
if (-not (Test-Path $Source)) { throw "Нет папки $Source" }
Compress-Archive -Path $Source -DestinationPath $Dest -Force
Write-Host "OK: $Dest"
Тот же смысл на Bash — архив с датой в галерее Lab и рекомендации по cron.
PowerShell — что освоить в первую очередь
| Тема | Команда / идея | Зачем |
|---|---|---|
| Объекты в pipeline | Get-Process | Sort CPU -Desc | Select -First 10 | Не парсить текст как в cmd |
| Политика ошибок | $ErrorActionPreference = 'Stop' | Скрипт не "молча" продолжается |
| Параметры | [CmdletBinding()] + param() | Переиспользуемые скрипты |
| Удалённо | Enter-PSSession, Invoke-Command | Home Lab, серверы |
| Модули | Install-Module, Import-Module | Расширение без exe |
Углубление: основы PS, ошибки.
Bash и WSL на Windows
После wsl --install (дистрибутив Ubuntu по умолчанию):
# Бэкап в WSL — пример
set -euo pipefail
SRC="$HOME/projects"
DEST="/mnt/d/Backup/projects_$(date +%Y%m%d).tar.gz"
tar -czf "$DEST" -C "$(dirname "$SRC")" "$(basename "$SRC")"
echo "OK: $DEST"
Путь /mnt/d/ — диск D: Windows. Скрипты из WSL удобно вызывать из Task Scheduler: wsl.exe -e bash /home/user/backup.sh.
Python — когда он выигрывает у PS
- парсинг JSON/API, Telegram-боты, pandas для CSV;
- кроссплатформенность (тот же скрипт на Linux-сервере);
- библиотеки —
requests,pathlib,shutil,schedule.
Минимальный health-check сайта:
import os
import sys
import urllib.error
import urllib.request
url = os.environ.get("HEALTH_URL", "https://example.com/")
try:
with urllib.request.urlopen(url, timeout=10) as r:
code = r.status
print(f"{url} -> HTTP {code}")
sys.exit(0 if code == 200 else 1)
except urllib.error.HTTPError as e:
print(f"HTTP {e.code}: {e.reason}")
sys.exit(1)
except urllib.error.URLError as e:
print(f"Сеть/DNS: {e.reason}")
sys.exit(1)
Код 200 означает "страница отдалась нормально"; 5xx — ошибка на сервере, таймаут — сеть или DNS. Токен Telegram и пароли — в переменных окружения, не в коде:
import os
token = os.environ["TELEGRAM_BOT_TOKEN"] # KeyError, если не задан
Старт: первая программа, модули.
Сравнение "что на чём писать"
| Задача | PowerShell | Bash | Python |
|---|---|---|---|
| Переименовать 1000 файлов | Rename-Item | mv + цикл | pathlib |
| Службы Windows | Get-Service | — | subprocess |
| Cron на Linux-сервере | — | cron | APScheduler |
| Парсинг REST API | Invoke-RestMethod | curl + jq | requests |
| GUI-автоматизация | ограничено | — | PyAutoGUI (осторожно) |
Установка и воспроизводимость окружения
Продвинутый пользователь фиксирует софт, а не "качает с сайта снова":
winget export -o C:\Setup\apps.json
winget import -i C:\Setup\apps.json
Альтернатива: Chocolatey (choco install), списки пакетов в Git. Для Linux-сервера — скрипт bootstrap.sh с apt install и копированием конфигов.
Макросы, AutoHotkey и "кликеры"
Макрос — записанная или запрограммированная последовательность действий — нажатия клавиш, клики, вставка текста. На Windows чаще всего:
- AutoHotkey — горячие клавиши, переназначение, автоматизация окон (см. инструменты автоматизации);
- Power Automate Desktop — визуальные сценарии для UI;
- встроенные макросы в Excel, IDE, игровых клавиатурах.
Автокликеры и боты для онлайн-игр и SaaS — нарушение правил сервиса и риск бана. Для своей рутины (повтор в одном приложении, accessibility, внутренний инструмент с явным разрешением в лицензии или политике) — нормальная практика, как в Софт: автоматизация. Не путайте с читами и фармом в чужих сервисах.
Продвинутый подход — макросы документировать, хранить в Git, не зашивать пароли в .ahk.
Пример AutoHotkey — быстрый блокнот и вставка пути
; Win+Alt+N — блокнот
#!n::Run "notepad.exe"
; Win+Alt+C — путь к файлу из буфера (если копировали в проводнике)
#!c::
{
path := Trim(A_Clipboard, "`r`n ")
if FileExist(path)
Run 'explorer.exe /select,"' path '"'
}
Храните .ahk в Documents\Scripts, автозапуск через ярлык в shell:startup или Task Scheduler.
Power Automate Desktop
Подходит, если:
- нужно "записать" клики для legacy-приложения без API;
- пользователь не готов к коду, но готов к диаграмме.
Минусы — хрупкость при смене DPI/темы, сложнее версионировать, чем .ps1.
Локальные сценарии (без "облака автоматизации")
| Механизм | Windows | Linux |
|---|---|---|
| Планировщик | Планировщик заданий, schtasks | cron, systemd timer |
| Триггеры по событию | Task Scheduler (вход, простой) | udev, inotify |
| Запуск при входе | Папка "Автозагрузка", Task Scheduler | ~/.config/autostart |
Типовые сценарии power user:
- ночной архив рабочей папки;
- очистка
%TEMP%старше N дней; - проверка, что NAS/сайт отвечает, и уведомление в Telegram (Python + API);
- синхронизация
robocopy/rsyncперед выключением.
Статья 2.06 — планирование задач углубляет тему для серверов.
Планировщик Windows — надёжный запуск скрипта
- Создать задачу → триггер (ежедневно 03:00).
- Действие: программа
pwsh.exe, аргументы-NoProfile -File "D:\Scripts\backup.ps1". - "Выполнять с наивысшими правами" — только если скрипту нужно (иначе нет).
- "Выполнять при простое" / "при питании от сети" для ноутбука.
- Вкладка "Параметры" → перезапуск при сбое, запись в журнал.
Логируйте в файл:
function Write-Log($msg) {
"$((Get-Date -Format o)) $msg" | Add-Content -Path 'D:\Logs\backup.log'
}
robocopy и rsync
| Утилита | Платформа | Типичный вызов |
|---|---|---|
robocopy | Windows | robocopy D:\Work E:\Backup\Work /MIR /Z /R:2 /W:5 /LOG+:D:\Logs\robocopy.log |
rsync | Linux/WSL | rsync -av --delete src/ user@nas:/volume/backup/ |
/MIR зеркалирует — удаляет лишнее в назначении; сначала тест без /MIR или с /L (list only):
robocopy D:\Work E:\Backup\Work /L /MIR /NJH /NJS
Один экземпляр скрипта (lock-файл)
$lock = 'D:\Logs\backup.lock'
if (Test-Path $lock) { Write-Error 'Уже выполняется'; exit 1 }
New-Item -ItemType File -Path $lock -Force | Out-Null
try {
# ... основная работа ...
} finally {
Remove-Item $lock -ErrorAction SilentlyContinue
}
Стоит ли автоматизировать задачу
Краткая таблица решений (подробные формулы окупаемости здесь не нужны — важнее здравый смысл):
| Критерий | Автоматизировать | Оставить вручную |
|---|---|---|
| Частота | Раз в неделю и чаще | Раз в полгода |
| Время | > 5–10 минут за раз | 30 секунд |
| Правила | Чёткие ("все .log старше 7 дней → архив") | Нужны суждения человека |
| Риск | Ошибка = потеря данных | Легко откатить |
Три инженерных принципа
- Идемпотентность — повторный запуск не плодит дубликаты (проверка "уже сделано?").
- Атомарность — пишем во временную папку, потом переименовываем (не половина файлов скопирована).
- Лог — дата, статус, параметры; при сбое понятно, на каком шаге упало.
Пример идемпотентности:
$marker = "D:\Backup\projects_$(Get-Date -Format yyyyMMdd).zip"
if (Test-Path $marker) { Write-Host 'Уже есть за сегодня'; exit 0 }
Cron (Linux) и Планировщик заданий (Windows) — расписание; на серверах с systemd часто timer. Для домашнего ПК достаточно Task Scheduler.
Обработка ошибок в PowerShell: глава про ошибки.
Типичные ошибки
Скрипты PowerShell/Bash и команды от ИИ-агента в IDE работают с вашими правами. robocopy /MIR, rm -rf, git reset --hard — Опасные скрипты.
| Ошибка | Последствие | Как избежать |
|---|---|---|
| Нет проверки пустой папки / битого файла | Скрипт "успешно" ничего не сделал | Явные if, коды выхода |
| Удаление без бэкапа | Невосстановимые данные | -WhatIf, dry-run, снапшот |
| Пароли в коде | Утечка через Git | Переменные окружения, vault |
| Два экземпляра скрипта | Гонки, блокировки файлов | lock-файл, mutex |
| Команда из чата / от агента без чтения | Снесённый диск или Git | Опасные скрипты |
Каталог готовых идей для скриптов
| Идея | Сложность | Польза |
|---|---|---|
| Архив папки "Проекты" по расписанию | Низкая | Защита от случайного удаления |
Очистка %TEMP% старше 14 дней | Низкая | Место на диске |
| Список файлов > 1 ГБ на диске | Низкая | Найти "пожирателей" |
| Проверка SSL-сертификата сайта | Средняя | Домашний сервер |
| Синхронизация фото на NAS | Средняя | Свой "облако" |
| Парсинг цен / RSS в Telegram | Средняя | Учёба API |
| Генерация отчёта из логов | Высокая | Мост к аналитике |
Начните с одной строки из таблицы, доведите до работы две недели — потом усложняйте.
Связь с программированием
Скрипт — мост к разработке — те же переменные, функции, Git, тесты. Многие начинают с "автоматизировать бэкап", а через год пишут сервисы. Обратное тоже верно: разработчик без скриптов на своём ПК теряет время на рутину.
Полезные привычки из разработки для скриптов:
- репозиторий
dotfilesилиscriptsна GitHub (без секретов); .envдля токенов (файл в.gitignore);- версия интерпретатора в README (
Python 3.12,pwsh 7.4).
Следующий шаг по карте: виртуальные машины и Home Lab — место, где скрипты разворачивают сервисы без риска для основной системы.