Цикл довузовской подготовки кафедры ЭФУ

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

Командная оболочка позволяет запускать команды разных типов: встроенные команды, утилиты и приложения, рассчитанные на командную строку. По умолчанию, все они получают ввод из параметров, указываемых при вызове команды, и выводят результат в стандартное окно консоли. Но иногда нужно получить ввод из другого источника либо направить вывод в файл или на другое устройство вывода, например, на принтер или в файл. Более того, в командном интерпретаторе Cmd.exe существуют возможность перенаправить вывод отработавшей команды другим командам, в качестве ввода – это так называемая конвейеризация (piping). Формы перенаправления ввода/вывода проиллюстрированы в Таблице 2.2.

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

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

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

При построении дерева B (Рис. 5.1) для создания текстовых файлов без помощи Notepad, можно использовать перенаправление стандартного вывода команды ECHO (Пример 2.5), предназначенной для вывода текстовых сообщений в формате:


ECHO [сообщение]



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

d:\WINLAB>md vasya\every\answer, vasya\mod\yeah, vasya\mod\moscow
d:\WINLAB>tree vasya
D:\WINLAB\VASYA
├───every
│   └───answer
└───mod
    ├───moscow
    └───yeah
d:\WINLAB>chcp 1251
Текущая кодовая страница: 1251
d:\WINLAB>echo На это каждый ответит, каждый ответит: > vasya1.txt
d:\WINLAB>dir /b
backup
papa
vasya
vasya1.txt
d:\WINLAB>move vasya1.txt vasya\every\answer\
Перемещено файлов:         1.
d:\WINLAB>tree vasya /f
D:\WINLAB\VASYA
├───every
│   └───answer
│          vasya1.txt
└───mod
    ├───moscow
    └───yeah
d:\WINLAB>
d:\WINLAB>more < vasya\every\answer\vasya1.txt
На это каждый ответит, каждый ответит:
d:\WINLAB>
		

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

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


ECHO [ON | OFF]


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


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

d:\WINLAB>tree vasya /f
D:\WINLAB\VASYA
├───every
│   └───answer
│          vasya1.txt
│          vasya2.txt
└───mod
    ├───moscow
    └───yeah
d:\WINLAB>copy con vasya\mod\yeah\vasya3.txt
Ну кто его не знает? Yeah, yeah!
^Z – Символ «конец файла», инициируемый нажатием «Ctrl+Z»
Скопировано файлов:         1.
d:\WINLAB>tree vasya /f
D:\WINLAB\VASYA
├───every
│         └───answer
│                vasya1.txt
│                vasya2.txt
└───mod
    ├───moscow
    └───yeah
         vasya3.txt
d:\WINLAB>more < vasya\mod\yeah\vasya3.txt
Ну кто его не знает? Yeah, yeah!
d:\WINLAB>copy vasya\mod\yeah\vasya3.txt con
Ну кто его не знает? Yeah, yeah!
Скопировано файлов:         1.
d:\WINLAB>
		

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

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


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

d:\WINLAB>tree vasya /f

D:\WINLAB\VASYA
├───every
│        └───answer
│               vasya1.txt
│               vasya2.txt
└───mod
    ├───moscow
    │     vasya4.txt
    └───yeah
          vasya3.txt

d:\WINLAB>dir vasya /b /s

d:\WINLAB\vasya\every
d:\WINLAB\vasya\mod
d:\WINLAB\vasya\every\answer
d:\WINLAB\vasya\every\answer\vasya1.txt
d:\WINLAB\vasya\every\answer\vasya2.txt
d:\WINLAB\vasya\mod\moscow
d:\WINLAB\vasya\mod\yeah
d:\WINLAB\vasya\mod\moscow\vasya4.txt
d:\WINLAB\vasya\mod\yeah\vasya3.txt

d:\WINLAB>dir vasya /b /s | find ".txt"

d:\WINLAB\vasya\every\answer\vasya1.txt
d:\WINLAB\vasya\every\answer\vasya2.txt
d:\WINLAB\vasya\mod\moscow\vasya4.txt
d:\WINLAB\vasya\mod\yeah\vasya3.txt

d:\WINLAB>
		

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


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

d:\WINLAB>cd vasya
d:\WINLAB\vasya>dir /b
every
mod
vasya.list

d:\WINLAB\vasya>dir /b /s | find ".txt" > vasya.list

d:\WINLAB\vasya>dir /b
every
mod
vasya.list

d:\WINLAB\vasya>more vasya.list
d:\WINLAB\vasya\every\answer\vasya1.txt
d:\WINLAB\vasya\every\answer\vasya2.txt
d:\WINLAB\vasya\mod\moscow\vasya4.txt
d:\WINLAB\vasya\mod\yeah\vasya3.txt

d:\WINLAB\vasya>for /f %x in (vasya.list) do copy /y %x every\answer\

d:\WINLAB\vasya\every\answer\vasya1.txt 
Невозможно скопировать файл поверх самого себя.

d:\WINLAB\vasya\every\answer\vasya2.txt
Невозможно скопировать файл поверх самого себя.
d:\WINLAB\vasya\mod\moscow\vasya4.txt 
Скопировано файлов:         1.
d:\WINLAB\vasya\mod\yeah\vasya3.txt 
Скопировано файлов:         1.

d:\WINLAB\vasya>dir /b every\answer
vasya1.txt
vasya2.txt
vasya3.txt
vasya4.txt

d:\WINLAB\vasya>
		

Команда 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):


MORE [/E [/C] [/P] [/S] [/Tn] [+n]] < [диск:][путь]имя_файла


имя_команды | MORE [/E [/C] [/P] [/S] [/Tn] [+n]]



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

d:\WINLAB\vasya\every\answer>for /f %x in ('dir /b') do more %x >> vasya.txt
ВЫДАЧА
d:\WINLAB\vasya\every\answer>more vasya1.txt  1>>vasya.txt
d:\WINLAB\vasya\every\answer>more vasya2.txt  1>>vasya.txt
d:\WINLAB\vasya\every\answer>more vasya3.txt  1>>vasya.txt
d:\WINLAB\vasya\every\answer>more vasya4.txt  1>>vasya.txt

d:\WINLAB\vasya\every\answer>more < vasya.txt

На это каждый ответит, каждый ответит:
-Конечно, Вася, Вася, Вася,
Ну кто его не знает? Yeah, yeah!
Вася, Вася, Вася - стиляга из Москвы.

d:\WINLAB\vasya\every\answer>