1

Тема: CMD/BAT: Макросы DOSKEY — полезная вещь, которую не многие используют

Многие пользуются в повседневной работе командным интерпретатором Windows (cmd.exe), т.к. бывают задачи которые намного продуктивней делать в консоли, а есть и такие задачи которые по-другому и не выполнишь.
Но иногда надоедает вводить одни и те же команды при выполнении однотипных действий. Кто-то для автоматизации своей рутины использует командные файлы (cmd, bat), кто-то пишет скрипты на более высоком уровне (vbs, js, etc). Но иногда бывает, что просто не целесообразно "городить огород" из скриптов и им подобных. Так как для каждого конкретного случая нужно будет писать свой конкретный сценарий, как следствие, когда этих сценариев будет много, засорение файловой системы, да и просто может возникнуть путаница.
Приведу пример.
При щелчке ПКМ на значке сетевого подключения в появившемся меню есть опция «Исправить». Функционал этой опции можно воспроизвести посредством нескольких команд:

Ipconfig /release
Ipconfig /flushdns
Ipconfig /renew
Ipconfig /registerdns

Но вводить каждый раз эти команды вручную не особенно хочется. Видится такой явный выход из данной ситуации: поместить данные командный сценарий, что-нибудь типа ipdebug.cmd, и в последствии запускать уже его.
Еще пример:
есть в windows такая хорошая команда shutdown, при помощи нее можно производить различные действия, связанные с выключением компьютера (shutdown –r – перезагрузка через 30 сек, shutdown –l – завершение сеанса пользователя). Можно конечно вводить все параметры командной строки вручную, можно для каждого случая так же сделать командный файл и запускать его, но всё это не очень удобно, т.к. либо нужно помнить параметры запуска, либо засорять ФС лишними файлами.

Но выход есть. И довольно «элегантный». Это макросы DOSKEY!

Из встроенной справки Windows:
«Doskey - Вызов программы Doskey.exe, которая позволяет повторно вызывать команды Windows XP, редактировать командные строки и создавать макросы».
Задается какой-либо макрос так:
Doskey имя_макроса=текст_макроса
Текст_макроса – это список команд вызываемых макросом.

Например:

Doskey reboot= shutdown –r –t 10 –c "Компьютер будет перезагружен"

Если мы выполним эту команду, то создастся макрос reboot, при запуске которого появится окно с сообщением “Компьютер будет перезагружен” и через 10 сек. компьютер перезагрузится.
Так же можно использовать макросы doskey в большинстве консольных приложений.
Например:
Nslookup, чтобы посмотреть все A-записи домена DOMAIN нужно ввести команду ls –t A DOMAIN. А можно сделать макрос doskey.

Doskey /exename=nslookup.exe list=ls –t A DOMAIN.

Теперь в nslookup достаточно ввести list и мы получим список А-записей в домене DOMAIN.

Неправда ли удобно?

Однако все введенные вручную макросы действительны только в течение активной сессии. Чтобы каждый раз не вводить макросы заново можно их хранить в текстовом файле. И подгружать их оттуда командой doskey /macrofile=имя_файла. Где имя_файла – текстовый файл с макросами doskey.
Чтобы выгрузить все введенные вручную макросы в файл можно воспользоваться командой

doskey /macros:all > файл_для_макросов

Вообще синтаксис файла макросов следующий:

[имя_исполняемого_файла1.с_расширением]
    Макрос1=список_команд
    Макрос2=список_команд
...
    МакросN=список_команд

[имя_исполняемого_файлаN.с_расширением]
    Макрос1=список_команд
    Макрос2=список_команд
...
    МакросN=список_команд

Например:

[nslookup.exe]
    list=ls -t A DOMAIN

[cmd.exe]
    man=if /i "$1" neq "" hh ntcmds.chm::/$1.htm
    ipdebug=ipconfig /release&ipconfig /flushdns&ipconfig /renew&ipconfig /registerdns
    reboot=shutdown -r -t 0$1 –c "Компьютер будет перезагружен"
    logoff=shutdown -l
    poweroff=shutdown -s -t 0$1 –c "Компьютер будет выключен"
    lock=%SystemRoot%\system32\rundll32.exe USER32.DLL,LockWorkStation
    ls=dir $*

Чтобы не подгружать файл макросов вручную удобно поместить его вызов в автозапуск командного процессора в реестре.

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor]
"AutoRun"="doskey /Macrofile=с:\\windows\\doskey.macro"

Подробно о данной программе можно прочитать во встроенной справке windows:

hh ntcmds.chm::/doskey.htm

2

Re: CMD/BAT: Макросы DOSKEY — полезная вещь, которую не многие используют

Пользуюсь еще вот макросом netrestart
Используется он для перезапуска служб, например:

netrestart spooler

Если создавать его из командной строки, то выглядит он так:

netrestart=net stop $1$tnet start $1

Или же, если он прописан в файле макросов (как у меня), то:

netrestart=net stop $1&net start $1

3 (изменено: VitAliS, 2009-12-02 08:32:42)

Re: CMD/BAT: Макросы DOSKEY — полезная вещь, которую не многие используют

Вот еще один хороший макрос
Выводит текущую дату и время, а так же сообщает если время обеденное (конечно если обед у Вас с 13 до 14 часов):

 now=if %time:~0,2% EQU 13 (@echo Сейчас: %date% %time:~0,5%, Обед!) Else (@echo Сейчас: %date% %time:~0,5%)

Если же просто нужно вывести на экран текущие дату и время, выглядеть он будет так:

    now=@echo Сейчас: %date% %time:~0,5%

4

Re: CMD/BAT: Макросы DOSKEY — полезная вещь, которую не многие используют

Если нужно определить время последней регистрации пользователя в системе, можно использовать команду net user <имя>(или net user <имя> /domain если это пользователь домена)

Но для более удобного отображения информации можно использовать макрос подобный этому:

le=@for /f "usebackq tokens=2,*" %i in (`@net user $1 /domain^|find "Последний вход"`) do @For /f "usebackq tokens=2,*" %a in (`@net user $1 /domain^|find "Полное имя"`) do @echo Последний вход пользователя %b: %j

5 (изменено: Rumata, 2013-08-27 19:03:42)

Re: CMD/BAT: Макросы DOSKEY — полезная вещь, которую не многие используют

Команда DOSKEY существует уже черт знает сколько лет, но я ни разу не встречал ее активного использования. Возможно, просто не встречал. И не было подробного описания команды - чаще всего перевод самой справки практически во всех книгах по ДОС.

По сути же макросы ДОС это аналоги unix-команды alias. Смысл алиасов, макросов - сократить ручной набор в командной строке. Я бы не стал загружать отдельно каждый макрос. Пусть будут все и сразу. А вот страшную команду DOSKEY /MACROFILE=filename я бы сократил до вызова пакетного файла aliasrc.cmd со всем его содержимым:


:: aliasrc.cmd

@doskey /macrofile="%~f0" >nul
@goto :EOF

[cmd.exe]

now=echo %DATE% %TIME%

: Чтобы быть ближе к Unix
alias=if "$1" == "" ( doskey /macros ) else ( doskey $* )
history=doskey /history

: В некоторых учебниках по Unix встречались команды вида alias dir=ls. Пойдем обратным путем : )
ls=dir /b $*
ll=dir $*
ff=dir /b /s $*

: Шутки ради. find в DOS и Unix - разные команды. Теперь они "переименованы" и работают "так как надо"
grep=findstr $*
fgrep=find $*
find=dir /b /s $*

Дополнительно: DOSKEY очень капризная. Перед именем макроса НЕ ДОЛЖНО быть табуляции - либо ничего, либо пробелы. Любые неправильные с точки зрения программы строки игнорируются, но выводится предупреждение вида Invalid macro definition.

( 2 * b ) || ! ( 2 * b )