<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: Макросы DOSKEY — полезная вещь, которую не многие используют]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=3889&amp;type=atom" />
	<updated>2013-08-27T14:56:38Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=3889</id>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Макросы DOSKEY — полезная вещь, которую не многие используют]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=74989#p74989" />
			<content type="html"><![CDATA[<p>Команда DOSKEY существует уже черт знает сколько лет, но я ни разу не встречал ее активного использования. Возможно, просто не встречал. И не было подробного описания команды - чаще всего перевод самой справки практически во всех книгах по ДОС. </p><p>По сути же макросы ДОС это аналоги unix-команды alias. Смысл алиасов, макросов - сократить ручной набор в командной строке. Я бы не стал загружать отдельно каждый макрос. Пусть будут все и сразу. А вот страшную команду <strong>DOSKEY /MACROFILE=filename</strong> я бы сократил до вызова пакетного файла <strong>aliasrc.cmd</strong> со всем его содержимым: </p><div class="codebox"><pre><code>
:: aliasrc.cmd

@doskey /macrofile=&quot;%~f0&quot; &gt;nul
@goto :EOF

[cmd.exe]

now=echo %DATE% %TIME%

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

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

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

</code></pre></div><p>Дополнительно: DOSKEY очень капризная. Перед именем макроса НЕ ДОЛЖНО быть табуляции - либо ничего, либо пробелы. Любые неправильные с точки зрения программы строки игнорируются, но выводится предупреждение вида <em>Invalid macro definition</em>.</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2013-08-27T14:56:38Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=74989#p74989</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Макросы DOSKEY — полезная вещь, которую не многие используют]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=39986#p39986" />
			<content type="html"><![CDATA[<p>Если нужно определить время последней регистрации пользователя в системе, можно использовать команду net user &lt;имя&gt;(или net user &lt;имя&gt; /domain если это пользователь домена)</p><p>Но для более удобного отображения информации можно использовать макрос подобный этому:</p><div class="codebox"><pre><code>le=@for /f &quot;usebackq tokens=2,*&quot; %i in (`@net user $1 /domain^|find &quot;Последний вход&quot;`) do @For /f &quot;usebackq tokens=2,*&quot; %a in (`@net user $1 /domain^|find &quot;Полное имя&quot;`) do @echo Последний вход пользователя %b: %j</code></pre></div>]]></content>
			<author>
				<name><![CDATA[VitAliS]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24943</uri>
			</author>
			<updated>2010-10-06T08:04:04Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=39986#p39986</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Макросы DOSKEY — полезная вещь, которую не многие используют]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=31180#p31180" />
			<content type="html"><![CDATA[<p>Вот еще один хороший макрос<br />Выводит текущую дату и время, а так же сообщает если время обеденное (конечно если обед у Вас с 13 до 14 часов):<br /></p><div class="codebox"><pre><code> now=if %time:~0,2% EQU 13 (@echo Сейчас: %date% %time:~0,5%, Обед!) Else (@echo Сейчас: %date% %time:~0,5%)</code></pre></div><p>Если же просто нужно вывести на экран текущие дату и время, выглядеть он будет так:<br /></p><div class="codebox"><pre><code>    now=@echo Сейчас: %date% %time:~0,5%</code></pre></div>]]></content>
			<author>
				<name><![CDATA[VitAliS]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24943</uri>
			</author>
			<updated>2009-12-02T04:31:08Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=31180#p31180</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Макросы DOSKEY — полезная вещь, которую не многие используют]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=31052#p31052" />
			<content type="html"><![CDATA[<p>Пользуюсь еще вот макросом <strong>netrestart</strong><br />Используется он для перезапуска служб, например:<br /></p><div class="codebox"><pre><code>netrestart spooler</code></pre></div><p>Если создавать его из командной строки, то выглядит он так:<br /></p><div class="quotebox"><blockquote><p>netrestart=net stop $1<strong><span style="color: red">$t</span></strong>net start $1</p></blockquote></div><p>Или же, если он прописан в файле макросов (как у меня), то:<br /></p><div class="quotebox"><blockquote><p>netrestart=net stop $1<strong><span style="color: red">&amp;</span></strong>net start $1</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[VitAliS]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24943</uri>
			</author>
			<updated>2009-11-26T14:46:26Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=31052#p31052</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[CMD/BAT: Макросы DOSKEY — полезная вещь, которую не многие используют]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=30722#p30722" />
			<content type="html"><![CDATA[<p>Многие пользуются в повседневной работе командным интерпретатором Windows (cmd.exe), т.к. бывают задачи которые намного продуктивней делать в консоли, а есть и такие задачи которые по-другому и не выполнишь.<br />Но иногда надоедает вводить одни и те же команды при выполнении однотипных действий. Кто-то для автоматизации своей рутины использует командные файлы (cmd, bat), кто-то пишет скрипты на более высоком уровне (vbs, js, etc). Но иногда бывает, что просто не целесообразно &quot;городить огород&quot; из скриптов и им подобных. Так как для каждого конкретного случая нужно будет писать свой конкретный сценарий, как следствие, когда этих сценариев будет много, засорение файловой системы, да и просто может возникнуть путаница.<br />Приведу пример.<br />При щелчке ПКМ на значке сетевого подключения в появившемся меню есть опция «Исправить». Функционал этой опции можно воспроизвести посредством нескольких команд:<br /></p><div class="codebox"><pre><code>Ipconfig /release
Ipconfig /flushdns
Ipconfig /renew
Ipconfig /registerdns</code></pre></div><p>Но вводить каждый раз эти команды вручную не особенно хочется. Видится такой явный выход из данной ситуации: поместить данные командный сценарий, что-нибудь типа <em>ipdebug.cmd</em>, и в последствии запускать уже его.<br />Еще пример:<br />есть в windows такая хорошая команда shutdown, при помощи нее можно производить различные действия, связанные с выключением компьютера (shutdown –r – перезагрузка через 30 сек, shutdown –l – завершение сеанса пользователя). Можно конечно вводить все параметры командной строки вручную, можно для каждого случая так же сделать командный файл и запускать его, но всё это не очень удобно, т.к. либо нужно помнить параметры запуска, либо засорять ФС лишними файлами.</p><p>Но выход есть. И довольно «элегантный». Это макросы DOSKEY!</p><p>Из встроенной справки Windows:<br /><em>«Doskey - Вызов программы Doskey.exe, которая позволяет повторно вызывать команды Windows XP, редактировать командные строки и создавать макросы».</em><br />Задается какой-либо макрос так:<br /><em>Doskey имя_макроса=текст_макроса</em><br /><em>Текст_макроса</em> – это список команд вызываемых макросом.</p><p>Например:<br /></p><div class="codebox"><pre><code>Doskey reboot= shutdown –r –t 10 –c &quot;Компьютер будет перезагружен&quot;</code></pre></div><p>Если мы выполним эту команду, то создастся макрос reboot, при запуске которого появится окно с сообщением “Компьютер будет перезагружен” и через 10 сек. компьютер перезагрузится.<br />Так же можно использовать макросы doskey в большинстве консольных приложений.<br />Например:<br /><em>Nslookup</em>, чтобы посмотреть все <em>A</em>-записи домена <em>DOMAIN</em> нужно ввести команду <em>ls –t A DOMAIN</em>. А можно сделать макрос doskey.<br /></p><div class="codebox"><pre><code>Doskey /exename=nslookup.exe list=ls –t A DOMAIN.</code></pre></div><p>Теперь в nslookup достаточно ввести <em>list</em> и мы получим список <em>А</em>-записей в домене <em>DOMAIN</em>.</p><p>Неправда ли удобно?</p><p>Однако все введенные вручную макросы действительны только в течение активной сессии. Чтобы каждый раз не вводить макросы заново можно их хранить в текстовом файле. И подгружать их оттуда командой <em>doskey /macrofile=имя_файла</em>. Где <em>имя_файла</em> – текстовый файл с макросами doskey.<br />Чтобы выгрузить все введенные вручную макросы в файл можно воспользоваться командой<br /></p><div class="codebox"><pre><code>doskey /macros:all &gt; файл_для_макросов</code></pre></div><p>Вообще синтаксис файла макросов следующий:<br /></p><div class="codebox"><pre><code>[имя_исполняемого_файла1.с_расширением]
    Макрос1=список_команд
    Макрос2=список_команд
...
    МакросN=список_команд

[имя_исполняемого_файлаN.с_расширением]
    Макрос1=список_команд
    Макрос2=список_команд
...
    МакросN=список_команд</code></pre></div><p>Например:</p><div class="codebox"><pre><code>[nslookup.exe]
    list=ls -t A DOMAIN

[cmd.exe]
    man=if /i &quot;$1&quot; neq &quot;&quot; hh ntcmds.chm::/$1.htm
    ipdebug=ipconfig /release&amp;ipconfig /flushdns&amp;ipconfig /renew&amp;ipconfig /registerdns
    reboot=shutdown -r -t 0$1 –c &quot;Компьютер будет перезагружен&quot;
    logoff=shutdown -l
    poweroff=shutdown -s -t 0$1 –c &quot;Компьютер будет выключен&quot;
    lock=%SystemRoot%\system32\rundll32.exe USER32.DLL,LockWorkStation
    ls=dir $*</code></pre></div><p>Чтобы не подгружать файл макросов вручную удобно поместить его вызов в автозапуск командного процессора в реестре.</p><div class="codebox"><pre><code>[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor]
&quot;AutoRun&quot;=&quot;doskey /Macrofile=с:\\windows\\doskey.macro&quot;</code></pre></div><p>Подробно о данной программе можно прочитать во встроенной справке windows:<br /></p><div class="codebox"><pre><code>hh ntcmds.chm::/doskey.htm</code></pre></div>]]></content>
			<author>
				<name><![CDATA[VitAliS]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24943</uri>
			</author>
			<updated>2009-11-17T00:10:05Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=30722#p30722</id>
		</entry>
</feed>
