Архив метки: bat

Запускаем закрытую программу в Windows

Если ваша или не ваша программа по непонятным причинам закрывается, то лучше, конечно, разобраться по какой причине это происходит. Но бывают случаи, когда проще проверить запущен ли нужный процесс и если нужного процесса нет среди запущенных, то запустить его. Особенно это актуально, если программа чужая и исходников нет.
У меня такая ситуация случилась на сервере с ботами, которые должны трудиться круглые сутки, а они иногда «молча» выключаются.
В крон или планировщик вставляю следующий «батник»:

set fullname=c:\program\program.exe
set name=program.exe

tasklist /FO CSV /NH | find /I "%name%">nul

if %errorlevel% NEQ 0 (
start %fullname% 
echo %date% %time% "start closed process" >> loader.log
)

Пояснение построчно:

  • Строка 1: Полный путь к запускаемой программе
  • Строка 2: Название процесса, который надо мониторить в списке запущенных процессов
  • Строка 4: Команда tasklist получает список всех процессов, а команда find ищет в этом списке процесс, заданные в строке 2.
  • Строка 6: Если предыдущая команда (в строке 5) не вернула ошибку, то есть процесс найден в списке, то выполняется строка 7
  • Строка 7: запуск программы.
  • Строка 8: Запись в лог времени запуска нашей программы.

Можно было строку 2 (название запускаемого процесса) заменить на автоматическое получение из строки 1 таким образом:

for %%a in ("%fullname%") do set name=%%~nxa

Но в моем случае запускаемая программа и процесс имели разные названия.
Чаще всего запускаемый процесс и искомый в памяти — равны, так что лучше использовать в строке 2 вариант автоматического получения имени.

Конвертируем flac в mp3 из командной строки

Решил раз и навсегда закрыть для себя вопрос конвертации *.flac музыки в mp3 формат. Используя знания из статей под тэгом cmd, а именно из статей Как организовать цикл в bat или cmd файле и Как узнать размер и дату файла из командной строки подробно распишу как организовать конвертирование файлов из формата FLAC и формат MP3, находящихся в указанной в параметре cmd-скрипта папке и подпапках.
На написание этой статьи меня подтолкнула статья на хабре, только я буду делать скрипт под Windows.
Для конвертирования нам понадобятся установленные flac и lame, lame качал с сайта rarewares.org
В конце статьи я выложу архив со скриптом и нужными программами.

@echo off
echo flac2mp3.cmd [-r] папка
echo [-r] - удалять исходные flac файлы (не обязательно)
echo папка - папка с flac файлами. Обрабатываются так же и вложенные папки. Папка с пробелами указывается в кавычках - "папка"

set r=%1
set workdir=%2
if not exist %workdir% set workdir=%r%
if exist %r% set workdir=%r%
if not exist %workdir% (
echo Каталог не существует
exit
)

if /i %r%==-r (
  set r=1 
) else (
set r=0
)

for /f "tokens=*" %%a in (' dir /s /b %workdir%\*.flac ') do (
echo %%~da %%~pa %%~na
echo "%%~da%%~pa"%%~na.wav
flac -d -f "%%~a"
call :pack "%%~a"
rem lame -b 320 "%%~da%%~pa%%~na.wav" "%%~da%%~pa%%~na.mp3"
del /q "%%~da%%~pa%%~na.wav"
if %r%==1 del /q "%%~a"
)
exit

:pack
for /f "tokens=* delims== " %%i in ('metaflac.exe --show-tag=ARTIST %1 ') do set %%i
for /f "tokens=* " %%i in ('metaflac.exe --show-tag=TITLE %1 ') do set %%i
for /f "tokens=* " %%i in ('metaflac.exe --show-tag=ALBUM %1 ') do set %%i
for /f "tokens=* " %%i in ('metaflac.exe --show-tag=GENRE %1 ') do set %%i
for /f "tokens=* " %%i in ('metaflac.exe --show-tag=TRACKNUMBER %1 ') do set %%i
for /f "tokens=* " %%i in ('metaflac.exe --show-tag=DATE %1 ') do set %%i
echo lame -m j -q 0 -V 0 -s 44.1 --tt "%TITLE%" --tn "%TRACKNUMBER%" --ta "%ARTIST%" --tl "%ALBUM%" --ty "%DATE%" --tg "%GENRE%" "%~d1%~p1%~n1.wav" "%~d1%~p1%~n1.mp3"
lame -m j -q 0 -V 0 -s 44.1 --tt "%TITLE%" --tn "%TRACKNUMBER%" --ta "%ARTIST%" --tl "%ALBUM%" --ty "%DATE%" --tg "%GENRE%" "%~d1%~p1%~n1.wav" "%~d1%~p1%~n1.mp3"
exit /b 0


Как создать файл с именем равным текущей дате и времени

Чтобы создать из командной строки файл с именем равным текущей дате и времени создадим cmd файл с таким содержимым:

rem @echo off

set dd=%DATE%
set tt=%TIME%

set /a ddd=%dd:~0,2%
IF %ddd% LSS 10 (
  SET day=0%ddd%) else (
  SET day=%ddd%)
set month=%dd:~3,2%
set year=%dd:~6,4%

set /a ttt=%tt:~0,2%

IF %ttt% LSS 10 (
  SET hour=0%ttt%) else (
  SET hour=%ttt%)
 
SET minute=%tt:~3,2%
SET sec=%tt:~6,2%
   
echo %day% %month% %year% %hour% %minute% %sec%

copy nul %day%%month%%year%_%hour%%minute%%sec%.txt

Необходимо помнить, что получение даты и времени зависит от региональных настроек Windows. Поэтому первая строка закомментирована для возможности смотреть на результат каждой команды.
Рассмотрим команды.

  • В переменные dd и tt получаем текущую дату и время.
  • В переменную ddd из переменной с датой dd получаем теекущее число. Команда %dd:~0,2% значит взять из переменной dd 2 символа с начала строки (0 это первый символ строки). Например, на моем компьютере числа всегда двучначные и я не нуждаюсь в такой проверке и эта конструкция у меня заменяется на команду set day=%dd:~0,2%
  • Далее с 7 по 9 строку кода идет проверка текущего числа. Если число меньше 10, то начале числа добавляем символ 0. Это надо на случай если у нас дата выглядит например так: 1.12.2010. Чтобы все составляющие даты были одинаковой длины. Тут же получаем готовую переменную day, в которой хранится значение текущего числа
  • Строка 10. В переменную month из dd получаем текущий месяц. Берем два символа, начиная с третьего. Здесь можно так же как и с числом сделать проверку на меньше или больше 10. Но у меня почему-то на всех компах месяц всегда двузначный. Но этот момент надо учитывать.
  • Строка 11. В переменную year из dd получаем текущий год. Для этого берем 4 символа, начиная с шестого. Вообще с какого символа брать и сколько символов надо брать, легко отследить после команд из 3 и 4 строк кода. После выполнения cmd файла смотрим какие строки выдает ОС и отсчитываем с какого символа идет число, месяц и год.
  • Со строки 13 по 20 описаны аналогичные действия по получению текущего времени в переменные hour, minute и sec.

Приготовления закончены, команда в строке 22 выводит полученные значения. Если всё выводится корректно, то можно приступить к созданию файла.
Команда

copy nul %day%%month%%year%_%hour%%minute%%sec%.txt

создает пустой текстовый файл 09092010_102428.txt
Для создания архивов я обычно делаю чтобы год был в начале имени файла, затем месяц, а уже потом число. Это удобно для сортировки архивов.

copy nul %year%%month%%day%_%hour%%minute%%sec%.txt

Результат такой команды: 20100909_102441.txt

Как узнать размер и дату файла из командной строки

Супер мини статья 🙂

Простейший способ получить размер файла из командной строки Windows:

for %I in (file.ext) do echo %~zI

из хелпа по команде For в Cmd:


%~zI - переменная %I расширяется до размера файла

Аналогично для даты (модификации) файла:

for %I in (file.ext) do echo %~tI

из хелпа по команде For в Cmd:


%~tI - переменная %I расширяется до даты /времени файла

А вообще команда for /? очень полезная.