Секреты командной строки Windows, часть 1.

К сожалению, благодаря ряду независящих от нас причин, командная оболочка cmd.exe до сих пор не утратила своей актуальности. Многие системные администраторы используют ее для управления своими задачами, при отсутствии на OS других средств, либо в силу привычки. Несмотря свою на простоту, командная строка обладает рядом интересных и неочевидных возможностей. В этом посте я постараюсь рассказать, о некоторых недокументированных либо малоизвестных возможностях командной строки Windows.

>> Beep из bat-файла.

В консоли Windows отсутствует команда заставляющая пищать системный динамик, но существует "недокументированный" символ (•) при выводе которого на экран консоли системный динамик издает звук. Чтобы ввести его нужно в текстовом редакторе набрать "Alt+7". Например: @echo •.

Проблема заключается в том что не все редакторы сохраняют такие символы, а по закону подлости ты оказываешься за компьютером, который, как раз без такового. Но и это можно обойти: запустим cmd.exe и в командной строке наберем @Echo,  нажав комбинацию Ctrl+G или "Alt+7" получим ^G далее перенаправим это все в файл, должно получиться @Echo echo ^G >beep.bat. Файл-пищалка готов.

>> Внутренний вызов команды CALL.

Из справочной документации Microsoft мы знаем, что команда Call - совершает вызов одного пакетного файла из другого, без завершения выполнения первого файла, но мало кому известно что при помощи Call можно перемещаться по внутренним меткам того же cmd/bat файла, подобно команде Goto. @Зачем это нужно, ведь есть goto?" - спросите вы. А затем, что помимо просто перемещения по меткам команда Сall имеет две особенности :

  1. "Умеет" возвращаться к месту своего вызова с помощью специальной метки :EOF.
  2. Умеет передававать значения в "подпрограмму". Поясню на примере:

@echo off

Rem Вызываем подпрогамму

call :SQRT 2

call :SQRT 8

pause

goto :EOF

rem а вот тут уже выходим см. ниже.

rem ***Начало подпрограммы.***

:SQRT

set /a outputval= %1*%1

echo Корень из %1 равен %outputval%.

goto :EOF

rem не выходим, но всего лишь возвращаемся на место за вызовом

rem ***Конец подпрограммы.***

После выполнения данного командного сценария получим такой вывод:

Красиво, не правда ли? Такая незаметная возможность, может сэкономить кучу строк кода, и на время может показаться, что мы программируем на полноценном скриптовом языке.

Да, стоит учесть еще и то что в подпрограмму можно передавать несколько аргументов, тогда обращаться к ним следует так же как и к аргументам командной строки %1, %2, %3 … и далее по порядку.

Символы экранирования в bat-файле.

Что если вам надо вывести  в консоль текст содержащий операторы или спецсиволы?

Например надо вывести: “%TEMP%”. Попробуем ввести в командную строку Echo %TEMP%.

Результат:

 

На консоль вывелось значение переменной %TEMP%. Совсем не то что нам надо…  Для таких случаев и существуют символы экранирования “^” и “%”. Достаточно его подставить перед спецсимволом и интерпретатор поймет что мы хотим вывести именно символ а не строку или выражение.Для проверки создадим батник:

@Echo off
Echo съешь еще этих французских булок да выпей чаю ^
съешь еще этих французских булок да выпей чаю ^
съешь еще этих французских булок да выпей чаю ^
съешь еще этих французских булок да выпей чаю

Echo %%TEMP%%

Pause

Результат:

Как видим все работает и экономия кода на лицо.

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

На сегодня все, продолжение в другом посте.

3 комментария:

Unknown комментирует...

про Call очень классно. А можно с помощью этой команды в скрипте замутить цикл?
смысл такой: мне надо получить с помощью команды tasklist все процессы, запущенные на всех компах в кабинете и распихнуть их по разным текстовым файлам

Unknown комментирует...

Доброго времени! Заинтересовал beep но вопрос как сделать так чтобы звук в динамике был слишен удаленному клиенту к которому я подключаюсь терминально, а не мне. Тоисть я подключаюсь терминально к клиенту в некторое сообщение я добавил описаную вами выше команду @echo • и все хорошо пищит но только мне а ни клиенту, а хотелось бы наоборот.

Unknown комментирует...
Этот комментарий был удален автором.

Отправить комментарий