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 (изменено: greg zakharov, 2013-08-27 14:59:58)

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

Вряд ли кто-то станет отрицать, что макросы в значительной мере могут повысить продуктивность работы в консоли. Однако, представьте себе ситуацию, когда из всего набора файла макросов, вам нужна всего пара-другая альясов команд. Для простоты примера будем предполагать, что альясы только для командной оболочки (см. первый пост VitAliS). Строго говоря, нам требуется сделать макросы портабельными, ипортируя их по мере необходимости, без всякой правки реестра и... самого файла макросов. Здесь, пожалуй, без теории никак.
Как подсказывает капитан Очевидность, создание макросов доступно и в командных сценариях, однако, если последовательно пытаться выполнять команду doskey <macros>, получим значительную задержку во времени, снизить в некоторой степени порог которой можно через цикл. Кому интересно знать почему так а не иначе, советую ознакомиться с принципами обработки данных в командной строке. Также, учитывая блочную структуру самих командных сценариев, можно вполне хранить текстовые данные после ключевого слова exit (желательно с параметром /b, дабы само окно консоли не захлопнулось в неподходящий момент). Это значит, что мы вправе создать такой сценарий, в котром бы хранились определения макросов, а их активация была бы избирательной. Чтобы стало понятно о чем речь, приведу пример.

@echo off
  setlocal enabledelayedexpansion
    ::только один аргумент может быть обработан одномоментно
    set "i=0"
    for %%i in (%*) do set /a "i+=1"
    if !i! equ 1 (
      ::находим метку логического окончания батника
      for /f "tokens=1 delims=:" %%i in ('findstr /n /l "exit /b" "%~dpnx0"') do set "i=%%i"
      ::параметр=макрос
      if "%1" equ "all" (
        ::параметр all импортирует все макросы
        for /f "tokens=*" %%i in ('more +!i! "%~dpnx0"') do doskey %%i
      ) else (
        ::избирательный импорт
        for /f "tokens=*" %%i in ('more +!i! "%~dpnx0"^
         ^| findstr /b /l /c:"%1="') do doskey %%i
      )
    ) else (
      echo.%~n0 v1.0 - quick marco^(s^) importer
      echo.Copyright ^(C^) 2013 greg zakharov
      echo.ScriptCoding - forum.script-coding.com
      echo.
      echo.Usage: %~n0 [all^|^<macros^>]
    )
  endlocal
exit /b
a=echo %date%
b=echo %time:~0,8%
c=echo %date% %time:~0,8%

Итак, мы обозвали наш сценарий import.cmd. Чтобы импортировать из него все макросы, вводим в консоли:

$ import.cmd all

Если нам требуется всего лишь макрос b, то:

$ import.cmd b

Что это нам дает? Во-первых, мобильность. Такой батник мы можем разместить на съемном диске или в облаке, но в отличие от файла макросов альясы импортируются избирательно, во-вторых, упрощает тест и отладку самих макросов.

6 (изменено: 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 )