Создаем свой Pomodoro-таймер в системном трее на чистом PowerShell
Техника Pomodoro — это популярный метод управления временем, разработанный Франческо Чирилло в конце 1980-х. Его суть проста: вы разбиваете работу на 25-минутные интервалы (называемые «помидорами»), разделенные короткими 5-минутными перерывами. После каждых четырех циклов следует длинный перерыв. Это помогает сохранять концентрацию, избегать выгорания и лучше контролировать рабочий процесс.
В этой статье я покажу, как написать свой Pomodoro-таймер на чистом PowerShell, который будет работать в фоновом режиме, отображать обратный отсчет в заголовке окна и управляться через контекстное меню в системном трее — при этом весь скрипт занимает менее 100 строк кода.
Мы будем использовать .NET Framework (библиотеки WinForms), что позволит нам:
- Создать иконку в области уведомлений.
- Работать с контекстным меню.
- Использовать объект «Таймер» для выполнения кода в фоновом режиме.
Шаг 1: Подготовка библиотек и переменных
Для создания графического интерфейса нам понадобятся сборки System.Windows.Forms и System.Drawing. Также мы определим настройки времени и будем использовать область видимости $script:, чтобы обработчики событий (клики по меню) имели прямой доступ к переменным таймера.
Шаг 2: Создание иконки в трее (NotifyIcon)
Объект NotifyIcon отвечает за появление иконки в системном трее (рядом с часами). Для максимальной стабильности в Windows 10/11 мы будем использовать стандартную системную иконку «Information» (синий кружок с буквой «i»).
Шаг 3: Логика таймера и автоматизация фаз
Таймер работает как событие, которое срабатывает каждую секунду. Здесь реализован автоматический переход: когда заканчивается время работы, скрипт сам переключается на отдых и начинает новый отсчет.
Важный нюанс: В современных версиях PowerShell (7+) при форматировании времени необходимо принудительно приводить числа к типу [int], чтобы избежать ошибок обработки строк.
Шаг 4: Управление через контекстное меню
Чтобы кнопки меню гарантированно срабатывали в любой версии PowerShell, мы создаем их как отдельные объекты ToolStripMenuItem и подписываемся на событие Click.
Шаг 5: Запуск цикла обработки событий
Без этого метода скрипт завершится мгновенно после выполнения кода. Команда Run() заставляет приложение «ожидать» действий пользователя и сигналов таймера.
Итоговый полный код можно найти в репозитории: pomodoro.ps1