Перенаправление ввода вывода и конвейеризация команд в windows

Обновлено: 04.07.2024

Есть 3 файловых дескриптора: stdin — стандартный ввод, stdout — стандартный вывод и stderr — стандартный поток ошибок. В скриптах 1 означает stdout , а 2 — stderr .

Практически это означает, что для программ, которые используют стандартные входные и выходные устройства, операционная система позволяет:

  • перенаправлять stdout в файл
  • перенаправлять stderr в файл
  • перенаправлять stdout в stderr
  • перенаправлять stderr в stdout
  • перенаправлять stderr и stdout в файл
  • перенаправлять stderr и stdout в stdout
  • перенаправлять stderr и stdout в stderr
  • перенаправление stderr и stdout по конвейеру

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

А теперь примеры:

1. Перенаправление стандартного потока программы в файл с заменой содержимого файла

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

2. Перенаправление стандартного потока программы в файл с до записью содержимого лога

Тоже самое, но при прерывание пинга и начале нового, старое содержимое лога не затрется, а новое дописывается в конец

3. Перенаправление потока ошибок программы в фаил с заменой содержимого

при этом, стандартный поток программы пойдет на экран, а ошибки будут записаны в лог, с заменой содержимого.

4. То же самое, но с до записью содержимого лога.

или с до записью лога

В данном примере стандартный поток ошибок пересылается в стандартный поток (конструкция 2>&1 ) а потом стандартный поток (уже с завернутым в него потоком ошибок) посылается в лог.

6. В этом примере все наоборот, стандартный поток, пересылается в поток ошибок и уже поток ошибок перенаправляется в лог:

или с до записью лога

Таким устройством является nul, и делать перенаправление в него можно используя все выше представленные комбинации. Например

В Linux есть еще одна конструкция перенаправления, а именно &>/var/log/log.txt , она перенаправляет ВСЕ без исключения потоки программы в указанное место, по сути являясь более коротким и более грамотным аналогом конструкции >log.txt 1>&2 . Но к сожалению в Windows это не работает.

А теперь давайте немного разберемся в прикладных различиях между работой данных методов. В нормальных приложениях все разбито на потоки, но у большинства виндовых утилит это не так, пинг например, пишет все в стандартный поток (на экран), поэтому для него конструкция вида 2> не имеет смысла. Но есть еще не виндовые утилиты, для примера возьмем curl (мой любимый).



Изменим вывод в лог на один из этих: 2> или 2>> ошибка ранее выводившаяся на экран, попала в лог, и на экране ничего не будет (служебной информации нет, так как запрос произведен не был).

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

И вывод был бы таким:


То есть, полная тишина, вся информация, как то полезный вывод, ошибки программы, служебная информация, все ушло в лог.

Делать пример с заворотом стандартного потока в поток ошибок ( 1>&2 ) я не буду, ибо там все точно так же.

В операционной системе Windows , как и в других операционных системах, интерактивные (набираемые с клавиатуры и сразу же выполняемые) команды выполняются с помощью так называемого командного интерпретатора, иначе называемого командным процессором или оболочкой командной строки ( command shell ). Командный интерпретатор или оболочка командной строки — это программа , которая, находясь в оперативной памяти, считывает набираемые вами команды и обрабатывает их. В Windows 9x, как и в MS-DOS , командный интерпретатор по умолчанию был представлен исполняемым файлом command . com . Начиная с версии Windows NT, в операционной системе реализован интерпретатор команд Cmd.exe, обладающий гораздо более мощными возможностями.

Запуск оболочки

В Windows NT/2000/XP файл Cmd.exe, как и другие исполняемые файлы, соответствующие внешним командам операционной системы, находятся в каталоге %SystemRoot%\SYSTEM32 (значением переменной среды %SystemRoot% является системный каталог Windows, обычно C:\Windows или C:\WinNT). Для запуска командного интерпретатора (открытия нового сеанса командной строки) можно выбрать пункт Выполнить… (Run) в меню Пуск (Start), ввести имя файла Cmd.exe и нажать кнопку OK. В результате откроется новое окно (см. рис. 2.1), в котором можно запускать команды и видеть результат их работы.

Командное окно интерпретатора Cmd.exe в Windows XP


Рис. 2.1. Командное окно интерпретатора Cmd.exe в Windows XP

Внутренние и внешние команды. Структура команд

Некоторые команды распознаются и выполняются непосредственно самим командным интерпретатором — такие команды называются внутренними (например, COPY или DIR ) Другие команды операционной системы представляют собой отдельные программы, расположенные по умолчанию в том же каталоге, что и Cmd.exe, которые Windows загружает и выполняет аналогично другим программам. Такие команды называются внешними (например, MORE или XCOPY ).

Рассмотрим структуру самой командной строки и принцип работы с ней. Для того, чтобы выполнить команду, вы после приглашения командной строки (например, C:\> ) вводите имя этой команды (регистр не важен), ее параметры и ключи (если они необходимы) и нажимаете клавишу <Enter>. Например:

Имя команды здесь — COPY , параметры — C:\myfile.txt и A:\ , а ключом является /V . Отметим, что в некоторых командах ключи могут начинаться не с символа /, а с символа – (минус), например, -V .

Многие команды Windows имеют большое количество дополнительных параметров и ключей, запомнить которые зачастую бывает трудно. Большинство команд снабжено встроенной справкой, в которой кратко описываются назначение и синтаксис данной команды. Получить доступ к такой справке можно путем ввода команды с ключом / ?. Например, если выполнить команду ATTRIB / ?, то в окне MS-DOS мы увидим следующий текст:

Для некоторых команд текст встроенной справки может быть довольно большим и не умещаться на одном экране. В этом случае помощь можно выводить последовательно по одному экрану с помощью команды MORE и символа конвейеризации |, например:

Вместо имени файла можно указывать обозначения устройств компьютера. В Windows поддерживаются следующие имена устройств: PRN (принтер), LPT1 –LPT3 (соответствующие параллельные порты), AUX (устройство, присоединяемое к последовательному порту 1), COM1–COM3 (соответствующие последовательные порты), CON (терминал: при вводе это клавиатура, при выводе - монитор), NUL (пустое устройство, все операции ввода/вывода для него игнорируются).

Перенаправление ввода/вывода и конвейеризация (композиция) команд

Рассмотрим более подробно поддерживаемые в Windows UNIX-подобные концепции переназначения устройств стандартного ввода/вывода и конвейерного выполнения команд.

Если при этом заданный для вывода файл уже существовал, то он перезаписывается (старое содержимое теряется), если не существовал — создается. Можно также не создавать файл заново, а дописывать информацию, выводимую командой, в конец существующего файла. Для этого команда перенаправления вывода должна быть задана так:

С помощью символа < можно прочитать входные данные для заданной команды не с клавиатуры, а из определенного (заранее подготовленного) файла:

4. Копирование и перемещение файлов и директорий

2. ЭФФЕКТИВНАЯ РАБОТА С КОМАНДНОЙ СТРОКОЙ

1. Полезные инструменты командной строки

2. Настройка параметров командной оболочки

3. Перенаправление ввода/вывода и конвейеры

3.ЧТО ДОЛЖЕН ЗНАТЬ НЕ ТОЛЬКО СИСАДМИН

1. Начало работы и внешний вид FAR

2. Основные операции FAR Manager

3. Дополнительные возможности FAR

2.3. Перенаправление ввода/вывода и конвейеры

Таблица 2.2. Варианты перенаправления ввода/вывода и конвейеров

Вариант перенаправленияКомментарий
1. команда > [путь]файл Вывод команды перенаправляется в файл – если такого файла нет, то он создается, а если файл существует, то он перезаписывается.
2. команда >> [путь]файл Вывод команды перенаправляется в файл – если такого файла нет, то он создается, а если файл существует, то данные добавляются в него.
3. команда

Любой из рассмотренных четырех вариантов может рассматриваться как отдельная команда и быть составной частью любого из тех же четырех вариантов.

Пример 2.5. Создание файла перенаправлением стандартного вывода в файл

Аналогичным образом предлагается создать файл VASYA2.TXT (Таблица 1.2, Рис. 1.5).

Следует отметить, что команда ECHO используется также для переключения режима отображения команд на экране (ввод ECHO без параметра служит для определения текущего состояния):

ECHO [ON | OFF]

К перенаправлению ввода/вывода можно отнести копирование данных командой COPY с консоли в файл, и из файла на консоль. По умолчанию, устройством ввода консоли является клавиатура, а устройством вывода – экран монитора, в общем случае входные и выходные устройства консоли могут быть переопределены. Системное имя консоли в Windows: CON.

Пример 2.6. Перенаправление ввода/вывода с консоли и на консоль

Когда речь идет о вводе данных, то CON –это клавиатура, а когда о выводе данных, то именем CON обозначается экран монитора. Используя копирование с консоли CON, (Пример 2.6) создадим файлы VASYA3.TXT и VASYA3.TXT как на ветке B (Рис. 1.5, Таблица 1.2).

Перенаправление вывода в файл с добавлением строк: «>>« будет рассмотрено немного позже, теперь же необходимо разобраться с конвейерами команд. Наиболее часто конвейеры используются в задачах поиска и сортировки данных – для этого в основном используются команды: FIND и MORE.

Пример 2.7. Применение конвейера для получения списка текстовых файлов

Команда FIND ищет строки в файлах или в тексте ввода и выводит строки, соответствующие условию. Например, можно получить список всех файлов с расширением «.TXT» в текущем каталоге и его подкаталогах, перенаправив вывод команды DIR на ввод FIND через конвейер (Пример 2.7).

Пример 2.8. Применение конвейера и цикла для копирования файлов

Команда FIND как фильтр текстовых строк в одном или нескольких файлах может применяться в формате:

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] «строка» [путь]имя_файла

/V – Вывод всех строк, НЕ содержащих заданную строку.

/C – Вывод общего числа строк, содержащих заданную строку.

/N – Вывод номеров отображаемых строк.

/OFF[LINE] – Не пропускать атрибут «Автономный».

/I – Поиск без учета регистра символов.

Если путь не задан, то команда FIND выполняет поиск в тексте консоли либо в тексте, переданном по конвейеру другой командой.

В предыдущем примере результаты фильтрации данных (список всех текстовых файлов директории VASYA) направлены в стандартный поток вывода – на экран, поэтому они носят чисто информативный характер. Для того чтобы использовать этот список в практических целях, например для копирования всех файлов директории в один каталог, список должен находиться в файле. Имя такого файла произвольно – для определенности можно дать имя файлу VASYA.LIST (Пример 2.8). Для анализа списка и выполнения операций с его элементами целесообразно использовать простые варианты специализированного цикла FOR в формате (где «переменная», обозначающая строку анализируемого одноэлементного списка может иметь любое имя – например «X»):

FOR /F %переменная IN (файл) DO команда [параметры]

FOR /F %переменная IN (‘команда’) DO команда [параметры]

Используя цикл FOR в формате обработки строк файлов, можно скопировать все текстовые файлы всех подкаталогов директории VASYA в один каталог (Пример 2.8), а затем объединить текстовые файлы (Пример 2.9), применяя перенаправление вывода в файл с добавлением данных: «>>«.

Команда MORE активно используется для перенаправления стандартного ввода и построения конвейеров команд в нижеследующих форматах (список ключей см. § 1.3):

perenapravlenie vvoda-vihvoda

В результате выполнения этой команды, информация о команде CD будет выведена не на экран, а в текстовый файл «file.txt», расположенный в текущем каталоге (т.е. на диске «С»). Причем, если этот файл существовал ранее в этом каталоге, он будет перезаписан, а если файла не существовало, он будет создан автоматически. Если необходимо дописать информацию в конец существующего файла, необходимо использовать конструкцию: команда >> имя файла. Для примера, допишем в текстовый файл «file.txt» информацию о команде COPY: help copy >> file.txt

perenapravlenie vvoda-vihvoda.

В результате выполнения данной команды файл «file.txt» не будет перезаписан, а новая информация будет добавлена в конец этого файла.
Одной из команд, которая использует чтение входных данных из заранее подготовленного файла, является команда SORT. Подробно данная команда описывается в следующих уроках. Здесь следует лишь сказать, что используемая без ключей, команда SORT производит сортировку в порядке возрастания. Для примера, создадим на диске «С» текстовый файл «text.txt» и запишем в него слова: «help», «turbo», «command».

perenapravlenie vvoda-vihvoda..

Тогда команда sort < text.txt прочитает информацию из текстового файла «text.txt» и выведет её на экран в алфавитном порядке.

perenapravlenie vvoda-vihvoda.

Одной из команд, которая использует конвейеризацию, является команда MORE. Более подробно, данная команда будет рассмотрена в следующих уроках. Здесь следует лишь сказать, что команда MORE считывает данные из конвейера или файла и выводит их на экран частями, причем размер каждой части не превышает размера окна командной строки. Для примера, выведем на экран справку о команде XCOPY: help xcopy |more

perenapravlenie vvoda-vihvoda.

В результате выполнения данной команды, на экран вывелась справка по команде XCOPY. Причем информация вывелась частично, только та часть, которая уместилась на экране. Для дальнейшего просмотра необходимо нажимать клавишу Enter.

читать входные данные не с клавиатуры (стандартный входной поток), а из заранее подготовленного файла (перенаправление ввода);

Если при этом заданный для вывода файл уже существовал, то он перезаписывается, если не существовал — создается. Можно также не создавать файл заново, а дописывать информацию, выводимую командой, в конец существующего файла. Для этого команда перенаправления вывода должна быть задана так:

С помощью символа < можно прочитать входные данные для заданной команды не с клавиатуры, а из определенного (заранее подготовленного) файла:

Приведем несколько примеров перенаправления ввода/вывода.

Вывод встроенной справки для команды COPY в файл copy.txt:

Добавление текста справки для команды XCOPY в файл copy.txt:

Вывод текущей даты в файл date.txt (DATE /T — это команда для просмотра и изменения системной даты, T ключ для получения только даты без запроса нового значения):

DATE /T > date.txt

команда 2> имя_файла

команда > имя_файла 2>&1

Например, в приведенной ниже команде стандартный выходной поток и стандартный поток ошибок перенаправляются в файл copy.txt:

XCOPY A:\1.txt C: > copy.txt 2>&1

Наконец, с помощью конструкции

Используя механизмы перенаправления ввода/вывода и конвейеризации, можно из командной строки посылать информацию на различные устройства и автоматизировать ответы на запросы, выдаваемые командами или программами, использующими стандартный ввод. Для решения таких задач служит команда

Удаление всех файлов в текущем каталоге без предупреждения (автоматический положительный ответ на запрос об удалении):

1.2.5. Команды MORE и SORT

Одной из наиболее часто использующихся команд, для работы с которой применяется перенаправление ввода/вывода и конвейеризация, является MORE. Эта команда считывает стандартный ввод из конвейера или перенаправленного файла и выводит информацию частями, размер каждой из которых не больше размера экрана. Используется MORE обычно для просмотра длинных файлов. Возможны три варианта синтаксиса этой команды:

Параметр [диск:][путь]имя_файла определяет расположение и имя файла с просматриваемыми на экране данными. Параметр имя_команды задает команду, вывод которой отображается на экране (например, DIR или команда TYPE, использующаяся для вывода содержимого текстового файла на экран). Приведем два примера.

Для поэкранного просмотра текстового файла news.txt возможны следующие варианты команд:

TYPE news.txt | MORE

Другой распространенной командой, использующей перенаправление ввода/вывода и конвейеризацию, является SORT. Эта команда работает как фильтр: она считывает символы в заданном столбце, упорядочивает их в возрастающем или убывающем порядке и выводит отсортированную информацию в файл, на экран или другое устройство. Возможны два варианта синтаксиса этой команды:

SORT [/R] [/+n] [[диск1:][путь1]файл1] [> [диск2:][путь2]файл2]

[команда |] SORT [/R] [/+n] [> [диск2:][путь2]файл2]

В первом случае параметр [диск1:][путь1]файл1 определяет имя файла, который нужно отсортировать. Во втором случае будут отсортированы выходные данные указанной команды. Если параметры файл1 или команда не заданы, то SORT будет считывать данные с устройства стандартного ввода.

Параметр [диск2:][путь2]файл2 задает файл, в который будет направляется сортированный вывод; если этот параметр не задан, то вывод будет направлен на устройство стандартного вывода.

По умолчанию сортировка выполняется в порядке возрастания. Ключ /R позволяет изменить порядок сортировки на обратный (от Z к A и затем от 9 до 0). Например, для поэкранного просмотра отсортированного в обратном порядке файла price.txt, нужно задать следующую команду:

SORT /R < price.txt |MORE

Ключ /+n задает сортировку в файле по символам n-го столбца. Например, /+10 означает, что сортировка должна осуществляться, начиная с 10-й позиции в каждой строке. По умолчанию файл сортируется по первому столбцу.

Читайте также: