Архив метки: командная строка

Запускаем закрытую программу в 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


Меняем шлюз по умолчанию из командной строки

Бывают ситуации, когда для автоматизации сетевых соединений необходимо автоматически менять параметры соединений. В этой короткой заметке хочу отобразить как быстро и просто можно из командной строки Windows поменять шлюз по умолчанию в сетевом соединении.

Для этого есть команда netsh. Читать далее Меняем шлюз по умолчанию из командной строки

ШПАРГАЛКА. Команды Unix — Linux

Полезные команды Linux тут
Перепечатаю на случай исчезновения источника

Файловые команды:

ls – список файлов и каталогов
ls -al – форматированный список со скрытыми каталогами и файлами
cd dir – сменить директорию на dir
cd – сменить на домашний каталог
pwd – показать текущий каталог
mkdir dir – создать каталог dir
rm file – удалить file
rm -r dir – удалить каталог dir
rm -f file – удалить форсированно file
rm -rf dir – удалить форсированно каталог dir
cp file1 file2 – скопировать file1 в file2
cp -r dir1 dir2 – скопировать dir1 в dir2; создаст каталог dir2, если он не существует
mv file1 file2 – переименовать или переместить file1 в file2. если file2 существующий каталог — переместить file1 в каталог file2
ln -s file link – создать символическую ссылку link к файлу file
touch file – создать file
cat > file – направить стандартный ввод в file
more file – вывести содержимое file
head file – вывести первые 10 строк file
tail file – вывести последние 10 строк file
tail -f file – вывести содержимое file по мере роста, начинает с последних 10 строк
————————————————————————————————————————————————————
Читать далее ШПАРГАЛКА. Команды Unix — Linux

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

Чтобы создать из командной строки файл с именем равным текущей дате и времени создадим 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 /? очень полезная.

Отправка электронного письма из командной строки Windows

Отправка электронного письма из командной строки Windows

Возникла необходимость отправлять данные через почтовый сервис, но чтобы не загружать пользователя ненужными действиями решил прибегнуть к консольной утилите для отправки e-mail под Windows — blat
Т.к. для отправки письма по протоколу SMTP без аутентификации уже не обойтись, то я для себя составил такой формат командной строки и вывел его в пакетный cmd файл:

blat.exe -server server.ru -f e-mail-from@server.ru -u e-mail-from@server.ru -pw pass  -to e-mail-to@server.ru -subject SUBJ -body "Текст сообщения" -attach FILE

Немного пояснений:

  • -server server.ru — сервер Исходящей почты. Несмотря на то, что мы отправляем из командной строки, но сервер, с которого будет уходить письмо, должен быть!
  • -f e-mail-from@server.ru — адрес отправителя. Как и в случае с сервером. Письмо должно быть от кого-то 😉
  • -u e-mail-from@server.ru — имя пользователя (логин) для сервера Исходящей почты. Используется для упомянутой выше SMTP аутентификации. В моем случае логин должен состоять из имени пользователя на сервере (то есть имя@сервер), это зависит от сервера. На других серверах может быть просто e-mail-from
  • -pw pass — пароль для той же аутентификации.
  • -to e-mail-to@server.ru — адрес получателя
  • -subject SUBJ — тема письма. Должна быть в кавычках, если есть пробелы!
  • -body "Текст сообщения" — текст письма. Должен быть в кавычках, если есть пробелы!
  • -attach FILE — собственно то, ради чего это всё я затеял. Путь к файлу и имя файла FILE 🙂

Все имена серверов и электронные адреса вымышлены. Совпадения случайны.
Если у кого-нибудь есть дополнения или уточнения по этому вопросу, вэлкам в каменты.