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

Скрипты, макросы и локальная автоматизация

Опытному пользователю

Что такое скриптовый язык

Скриптовый язык — язык, программы на котором обычно интерпретируются построчно (без отдельной стадии компиляции в .exe). Скрипт удобен для:

  • пакетной работы с файлами и папками;
  • вызова утилит ОС и API;
  • расписания (cron, Планировщик заданий);
  • "склеивания" нескольких программ в один сценарий.

От "больших" языков (C++, Java, C#) скрипты отличаются скоростью старта и низким порогом: можно решить задачу за вечер. Для продвинутого пользователя это главный рычаг эффективности.

Скрипт и программа: скрипт обычно запускается интерпретатором (python, pwsh, bash) построчно; программа на C#/Go сначала компилируется в исполняемый файл. Для разовой автоматизации скрипт выигрывает; для тяжёлой логики и распространения "как exe" — компилируемые языки (обзор разработки).

Код выхода — число, которое скрипт возвращает ОС: 0 = успех, ненулевое = ошибка. Планировщик и CI смотрят на него; в PowerShell после внешней команды проверяйте $LASTEXITCODE, в Bash — echo $? сразу после вызова.

Подробнее об экосистемах — Python, Bash, PowerShell. Обзор инструментов — в главе про софт.


Три столпа автоматизации на ПК

Язык / инструментПлатформаТипичные задачи
PowerShellWindows (и кроссплатформенный pwsh)Реестр, службы, AD/Azure, отчёты по системе
BashLinux, macOS, WSLСерверы, деплой, cron, пайплайны в терминале — галерея с разбором
PythonВездеФайлы, API, парсинг, боты, мини-утилиты

Когда что выбрать:

Терминал как среда — в разделе Терминал.


Мини-пример — идемпотентный бэкап (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 — что освоить в первую очередь

ТемаКоманда / идеяЗачем
Объекты в pipelineGet-Process | Sort CPU -Desc | Select -First 10Не парсить текст как в cmd
Политика ошибок$ErrorActionPreference = 'Stop'Скрипт не "молча" продолжается
Параметры[CmdletBinding()] + param()Переиспользуемые скрипты
УдалённоEnter-PSSession, Invoke-CommandHome 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, если не задан

Старт: первая программа, модули.


Сравнение "что на чём писать"

ЗадачаPowerShellBashPython
Переименовать 1000 файловRename-Itemmv + циклpathlib
Службы WindowsGet-Servicesubprocess
Cron на Linux-сервереcronAPScheduler
Парсинг REST APIInvoke-RestMethodcurl + jqrequests
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.


Локальные сценарии (без "облака автоматизации")

МеханизмWindowsLinux
ПланировщикПланировщик заданий, schtaskscron, systemd timer
Триггеры по событиюTask Scheduler (вход, простой)udev, inotify
Запуск при входеПапка "Автозагрузка", Task Scheduler~/.config/autostart

Типовые сценарии power user:

  • ночной архив рабочей папки;
  • очистка %TEMP% старше N дней;
  • проверка, что NAS/сайт отвечает, и уведомление в Telegram (Python + API);
  • синхронизация robocopy / rsync перед выключением.

Статья 2.06 — планирование задач углубляет тему для серверов.


Планировщик Windows — надёжный запуск скрипта

  1. Создать задачу → триггер (ежедневно 03:00).
  2. Действие: программа pwsh.exe, аргументы -NoProfile -File "D:\Scripts\backup.ps1".
  3. "Выполнять с наивысшими правами" — только если скрипту нужно (иначе нет).
  4. "Выполнять при простое" / "при питании от сети" для ноутбука.
  5. Вкладка "Параметры" → перезапуск при сбое, запись в журнал.

Логируйте в файл:

function Write-Log($msg) {
"$((Get-Date -Format o)) $msg" | Add-Content -Path 'D:\Logs\backup.log'
}

robocopy и rsync

УтилитаПлатформаТипичный вызов
robocopyWindowsrobocopy D:\Work E:\Backup\Work /MIR /Z /R:2 /W:5 /LOG+:D:\Logs\robocopy.log
rsyncLinux/WSLrsync -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 дней → архив")Нужны суждения человека
РискОшибка = потеря данныхЛегко откатить

Три инженерных принципа

  1. Идемпотентность — повторный запуск не плодит дубликаты (проверка "уже сделано?").
  2. Атомарность — пишем во временную папку, потом переименовываем (не половина файлов скопирована).
  3. Лог — дата, статус, параметры; при сбое понятно, на каком шаге упало.

Пример идемпотентности:

$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 — место, где скрипты разворачивают сервисы без риска для основной системы.