Недавно я столкнулся с такой проблемой, что играя на ПК в игру, у меня произошёл какой-то сбой — возможно, внезапно выключилось питание, или что-то ещё, сейчас уже не помню. Но суть в том, что пропала папка с сохранениями всего игрового процесса, на который было потрачено достаточно много времени, и восстановить её не удалось ни проверкой диска, ни специальными программами для восстановления потерянных/удалённых данных, что было очень обидно. Поэтому я решил, что нужно как-то автоматизировать процесс создания периодических резервных копий сохранений. В Windows это можно сделать, написав командный сценарий в файл с расширением .bat , который можно будет выполнять либо вручную, либо, к примеру, по планировщику задач.
Исходные данные
Имеем игру, в моём случае это симулятор грузовых перевозок — SnowRunner, который в процессе игры и при выходе автоматически сохраняет процесс игры, не давая возможности делать сохранения в отдельные слоты. Поэтому мне, соответственно, хотелось бы, чтобы каждый раз после выхода из игры создавалась резервная копия папки с сохранениями, и при этом хранились несколько экземпляров предыдущих резервных копий, например штук 5 (для возможности загрузить более раннее состояние игрового процесса), а более старые версии — удалялись.
Кроме того, у меня установлен автопереключатель раскладки клавиатуры Punto Switcher, который имеет неприятное свойство — начинать глючить через несколько минут игры (это касается не только SnowRunner, но и других игр, даже несмотря на то, что они добавлены в список исключений в настройках Punto Switcher), при этом, в момент заглючивания получается «залипание» клавиатуры в процессе игры на несколько секунд — что дико бесит, а после выхода из игры Punto Switcher просто не работает до его перезапуска. Поэтому было бы неплохо, чтобы перед запуском игры Punto Switcher автоматически выгружался, а после выхода из игры — запускался снова.
Пишем скрипт
Итак, напишем скрипт, который будет делать всё вышеперечисленное. Создадим текстовый файл с расширением .bat , например SnowRunner.bat в одной папке с .exe файлом запуска игры. Для удобства, я использую текстовый редактор Notepad++. Файл должен быть в кодировке 866 (DOS):
ECHO OFF
:: Указать путь к папке с сохранениями:
set SAVE_DIR="C:\path\to\SAVE"
:: Указать путь к папке где будут храниться резервные копии:
set BACKUP_DIR="D:\backups"
echo Остановка Punto Switcher...
taskkill /IM punto.exe /F
echo Запуск SnowRunner...
SnowRunner.exe && goto BACKUP
pause
goto EXIT
:BACKUP
d:
if not exist %BACKUP_DIR% mkdir %BACKUP_DIR%
cd %BACKUP_DIR%
echo Ротация старых резервных копий сохранений...
if exist SAVE5.rar del SAVE5.rar
if exist SAVE4.rar ren SAVE4.rar SAVE5.rar
if exist SAVE3.rar ren SAVE3.rar SAVE4.rar
if exist SAVE2.rar ren SAVE2.rar SAVE3.rar
if exist SAVE1.rar ren SAVE1.rar SAVE2.rar
if exist SAVE.rar ren SAVE.rar SAVE1.rar
echo Создание новой резервной копии сохранений...
"C:\Program Files\winrar\rar.exe" a -r -inul SAVE.rar %SAVE_DIR%
:EXIT
echo Запуск Punto Switcher...
start /D "C:\Program Files (x86)\Yandex\Punto Switcher" punto.exe
echo Готово. Выход...
ping 127.0.0.1 -n 1 > nul
Путь ярлыка на рабочем столе меняем с «SnowRunner.exe» на «SnowRunner.bat», и теперь, каждый раз при его запуске, будет запускаться данный скрипт и выполнять следующие команды:
- Остановка процесса Punto Switcher (punto.exe);
- Запуск SnowRunner.exe;
- После успешного выхода из SnowRunner — Ротация старых резервных копий и создание RAR архива актуальной резервной копии;
- Запуск Punto Switcher.
Я тут не расписываю подробно синтаксис команд, т.к. это выходит за рамки этой заметки. Всё это легко гуглится, кроме того, скрипт читается интуитивно понятно и, при необходимости, легко может быть изменён под другие задачи. Думаю, что при желании, его можно написать гораздо короче и элегантнее, с помощью регулярных выражений, но и такой вариант вполне работоспособен и свои функции выполняет.