Конвейер команд windows это

Конвейеризация команд Windows

технические науки

  • Кириченко Александр Аполлонович , профессор
  • Национальный исследовательский университет Высшая школа экономики
  • ПРОГРАММА
  • С#
  • КОМПЛЕКСИРОВАНИЕ
  • ПРОГРАММНЫЕ СРЕДСТВА
  • WINDOWS
  • СИСТЕМЫ КОМАНД
  • КОНВЕЙЕРИЗАЦИЯ КОМАНД

Похожие материалы

Конвейер команд

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

Рассмотрим выдачу, полученную командой dir для корневого директория диска СЛ.

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

Здесь приведен лишь фрагмент вывода по команде dir. Обратим внимание, что кроме огромного перечня файлов и папок команда dir даёт и сводные результаты: в директории хранится 9 файлов общим объёмом 622 331 байт, и 29 папок.

При этом на диске, в корневой директорий которого мы заглядывали, свободно 254 394 368 байт.

Это значит, что команда dir даёт достаточное количество информации, чтобы ответить на такие вопросы:

  • Сколько файлов содержится в данном каталоге?
  • Какой объём занимают файлы, хранящиеся в данном каталоге?
  • Сколько папок содержится в данном каталоге?
  • Сколько свободного места есть на данном диске?

Но чтобы получить ответы на эти вопросы, надо переворошить груду информации и найти в ней то, что Вас интересует.

Ответ должен быть коротким, понятным и информативным.

Чтобы удовлетворить этим требованиям, одной команды dir недостаточно.

Возможности этой (и других команд) можно расширить с помощью конвейера.

Вспомним, что есть ещё такая команда find, по которой можно среди большого количества строк найти ту, которая больше всего интересует.

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

Построим конвейер из двух команд: dir и find.

Первая команда получит информацию о корневом директории диска С:, а вторая позволит выделить из этой информации (иногда -очень большого объёма) нужную.

Такое сочетание команд в конвейере позволяет ответить на вопрос:

«Сколько файлов хранится в данной директории и каков их объём?».

Выполним в консоли команд:

Здесь для команды find в кавычках мы указали поисковое предписание: что искать? А если вместо слова «файлов» указать слово «байт»?

Получили то же самое.

Внутри одной строки программа find неспособна разделить информацию.

Использование конвейера команд

Сколько файлов хранится в данной директории и каков их объём?

Для ответа на вопрос, заданный в заголовке, составим запрос:

Для этой цели можно воспользоваться и другой программой: findstr.

Какие текстовые файлы хранятся в этом директории?

Для ответа на этот вопрос составим запрос:

В директории найдено два файла с расширением txt.

Завершение формирования электронного архива по направлению «Науки о Земле и энергетика»

Создание электронного архива по направлению «Науки о Земле и энергетика»

Электронное периодическое издание зарегистрировано в Федеральной службе по надзору в сфере связи, информационных технологий и массовых коммуникаций (Роскомнадзор), свидетельство о регистрации СМИ — ЭЛ № ФС77-41429 от 23.07.2010 г.

Соучредители СМИ: Долганов А.А., Майоров Е.В.

Стандартный ввод-вывод и конвейеры командной строки

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

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

(или соответственно ls >имя_файла ) и желаемая информация для будущего употребления запомнится в указанном файле. Ряд команд операционной системы строятся как фильтры, т.е. используют и стандартный ввод, и стандартный вывод. К таким командам относятся команды sort, more (общие для всех рассматриваемых ОС) и команда wc из Unix, которая подсчитывает число строк, слов и символов в файле, служащем для ввода информации (в частности, текста, вводимого с клавиатуры).

Практическое значение стандартного ввода-вывода особенно велико в связи с применением так называемых конвейеров в командной строке. Конвейер представляет заданное в команде связывание стандартного вывода одной команды с стандартным вводом другой – следующей в строке – команды. В качестве символа связывания команд в конвейер используется символ | (одинарная вертикальная черта). Конвейер по внешнему виду представляет запись

Читайте также:  Не загружает windows с загрузочного диска

Здесь стандартный вывод команды команда1 автоматически связывается со стандартным вводом команды команда2. Поэтому данные результата первой команды не появляются на экране, а полностью передаются на вход второй команды, которая и использует их в качестве обрабатываемой ее информации. В одной составной команде может быть построен конвейер не только из двух, но и из любого числа команд, соединенных при записи символом вертикальной черты. Единственное требование при этом заключается в том, что для соединяемых таким путем команд первая из них должна использовать стандартный вывод, а вторая – стандартный ввод.

Практически наиболее часто в конвейерах используется команда more, которая оказывается заключительной в конвейере, поскольку выводит на экран, а не в стандартный вывод. Ее значение в том, что вывод на экран производится порциями по размеру экрана, это позволяет удобно наблюдать результаты объемного вывода на экране, где без ее использования часть выводимых данных исчезает – автоматически выдвигается за верхнюю границу экрана. Даже в операционных системах типа MS эта вспомогательная команда достаточно широко используется при текстовом выводе информации, в частности в составной команде

(хотя следует помянуть, что модифицированная версия команды dir позволяет добиться того же эффекта с помощью дополнительной опции, но при этом надо помнить написание опции, а возможности команды more более универсальны и применимы с любой другой командой).

В Unix для использования конвейеров существует дополнительная команда tee, которая в качестве единственного аргумента требует указания имени файла и передавая данные со своего стандартного ввода на стандартный вывод одновременно запоминает передаваемые данные в заданном для нее файле. Она как бы кроме простой передачи с входа на выход еще и протоколирует все данные в файле.

При использовании стандартного ввода-вывода иногда возникает проблема запоминания сообщений об ошибках. Для вывода информации об ошибках предназначен стандартный поток ошибок, имеющий константное значение хэндла в Unix и OS/2, равное 2, причем этот вывод об ошибках по умолчанию поступает на экран.

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

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

Наконец, существует возможность при необходимости перенаправить стандартный вывод в стандартный поток ошибок, что задается записью

При использовании переназначений с помощью символов обозначений >имя_файла предыдущее содержимое файла с именем имя_файла теряется (внутренними процедурами файл открывается для записи с усХчением Фо нуля предыдущеУо содержимоУо). В ряде случаХв, особенно при протоколированШи ошШбок, может представлять интерес сохранение предыдущего содержимого указанного таким образом файла и приписывание в его конец новых данных. Для решений этой задачи предлагается использовать вместо одного символа ‘>’ два таких символа подряд и без разрыва между ними.

В частности команда

указывает – брать исходные данные в файле файл1, помещать данные стандартного вывода в файл файл2 и дописывать в конец файла файл3 сообщения стандартного потока ошибок текущей команды команда.

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Функции внутри конвейера команд в Windows PowerShell

Продолжаем рассматривать особенности применения функций и конвейеров в Windows PowerShell.

Конвейеры команд — несомненное достоинство PowerShell. Функции могут располагаться внутри конвейеров. В этом случае функция будет принимать входящий поток объектов через специальную переменную $Input .

Для лучшего понимания приведем пример.

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

Кроме цикла ForEach можно использовать также метод MoveNext() , а к текущему элементу входного потока обращаться при помощи свойства Current . В таком случае функция примет вид:

Запустив функцию, можно убедиться, что мы получили тот же результат.

Как видим, внедрить функцию в конвейер просто. Однако есть момент, который необходимо учитывать.

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

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

Filter имя_фильтра

Фильтры отличаются от функций тем, что в них вместо $Input используется специальная переменная $_ , которая соответствует текущему элементу, проходящему через фильтр.

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

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

Конвейеры в Windows PowerShell

Как мы уже говорили ранее, Windows PowerShell работает с объектами, которые являются совокупностью свойств и методов. По сути, работая с файлами, параметрами реестра или чем-то еще, PowerShell интерпретирует их в понятные для себя объекты.

Читайте также:  Как удалить окно при загрузке windows

Определив тип объекта, PowerShell способен выполнять с ними различные действия. При этом действия могут быть объединены в конвейеры.

Строго говоря, конвейер это не изобретение PowerShell. Конвейеризация есть и классической командной строке Windows. Правда там это объединение команд, при котором идет направление выходного потока текста из одной команды во входной команд другой.

В Windows PowerShell конвейеры передают не текст, а объекты. Каждая команда в конвейере получает объект от предыдущей, выполняет с ним операции и передаёт следующей. Команды в конвейере разделяются символом вертикальной черты |.

Ниже пошагово составим конвейер, который выводил бы на экран только конкретные параметры объекта PowerShell.

Как мы знаем, информацию о запущенных в системе процессах, можно получить командой

ниже пример её выполнения.

Каждый процесс это по сути своей объект в Windows PowerShell, который обладает определенными параметрами (Handles, NPM(K), PM(K) и т.д.).

По умолчанию в окне консоли выводится информацию не обо всех параметрах объекта. Для того, чтобы просмотреть все параметры нашего объекта (в данном случае запущенный процесс), составим небольшой конвейер:

В этом конвейере командлет Get-Process вывел информацию о запущенных процессах, которые в PowerShell являются объектами и передал эти объекты командлету Get-Member , который вывел информацию об их параметрах.

В чем практический смысл этого конвейера? Допустим, Вы хотите отслеживать «зависшие» процессы или их приоритет. По умолчанию PowerShell такие параметры не выводит. Для изменения параметров вывода нужно править определенные конфигурационные файлы. Но для начала нам нужно было узнать имена искомых параметров, что мы и сделали этим конвейером. Так, в частности, «завис» процесс или нет, показывает параметр Responding .

Что касается правки конфигурационных файлов, то к этой теме надо подходить с особенной осторожностью, и лучше было бы осветить её в отдельной статье. Для общего понимания скажу, что информация об отображении параметров объектов в PowerShell хранится в специальных конфигурационных файлах pslxml, находящихся в каталоге с PowerShell. Править эти файлы крайне не рекомендуется. Желательно создавать собственные конфигурационные файлы и включать их в состав автоматически загружаемых файлов при старте Windows PowerShell.

Обо всём этом поговорим подробнее в следующий раз.

Конвейер в PowerShell

Как задействовать все богатство функций PowerShell

Конвейер — основная концепция, которую необходимо изучить, иначе вы сможете использовать лишь ничтожную часть функций PowerShell. Конвейерный принцип был реализован еще в оболочках операционной системы Unix, затем скопирован в Cmd.exe, а в PowerShell поднят на новый уровень. Прежде чем перейти к теме конвейера PowerShell, я считаю целесообразным напомнить общие сведения, касающиеся стандартного входа и выхода.

Стандартный вход и выход

В Cmd.exe конвейер тесно связан со стандартным входом, перенаправлением входа, стандартным выходом и его перенаправлением. По существу, стандартный вход — это ввод с клавиатуры, если только вы не предписываете оболочке считать входные данные откуда-либо еще (перенаправление входа). Стандартный выход — это обычный результат выполнения команды, отображаемый на экране, если только вы не предписываете оболочке сохранить выходные данные куда-либо еще (перенаправление выхода).

Чтобы увидеть работу стандартного входа, введем в окне PowerShell или Cmd.exe следующую команду:

После ввода этой команды курсор стоит на месте и ждет дальнейшего ввода, так как по умолчанию команда Sort.exe сортирует стандартный вход. Поскольку мы ничего не указали, команда ожидает ввода. Для отмены действия команды нажмите комбинацию клавиш Ctrl+C.

Теперь предположим, что существует файл с именем MyData.txt, данные в котором требуется сортировать. Вот как будет выглядеть на экране сортируемый выход файла (стандартный выход):

В этом примере команда Type выводит содержимое файла MyData.txt как стандартный выход, который поступает на конвейер (|) и используется в качестве входа для Sort.exe.

Таким образом, используя в команде символ конвейера (|), мы создаем конвейер. При этом выход команды слева от этого символа поступает на вход команды, находящейся справа.

В большинстве командных оболочек (например, Cmd.exe) стандартный выход и стандартный вход представляют собой текст. Это делает решение многих задач, связанных с различными манипуляциями с данными, неудобным и громоздким. На приведенном экране показан пример «кульбитов», которые приходится сделать в Cmd.exe, чтобы всего лишь вывести список текстовых файлов, последний раз сохраненных в текущем году.

Экран. Сценарии Cmd.exe для вывода списка текстовых файлов, созданных в текущем году

Сценарий Sample1.cmd выводит время последнего сохранения каждого файла, за которым следует символ жесткой табуляции, после чего выводится имя файла. Сценарий Sample2.cmd берет текущий год и выполняет Sample1.cmd, выводя лишь те файлы, у которых год последнего сохранения совпадает с текущим годом. Красная стрелка указывает на символ жесткой табуляции в обоих сценариях. На экране также показан выходной результат выполнения Sample2.cmd (File1.txt и File3.txt).

Читайте также:  Архитектура файловой системы linux

Отметим, что оба сценария предусматривают синтаксический анализ строк, зависящий от формата строки даты (%%

tF в Sample1.cmd и %DATE% в Sample2.cmd). В отличных от американо-англоязычных версиях Windows строки кода, где используется дата, придется корректировать, так как различные языковые стандарты используют разные форматы даты. Кроме того, из-за мудреного синтаксиса сценарии Cmd.exe малопонятны и неудобны в использовании (к примеру, что означает%DATE:

Цель данного примера — продемонстрировать неуклюжее и громоздкое решение задачи, кажущейся простой (вывод списка файлов, созданных в текущем году). Здесь значительная часть проблемы обусловлена необходимостью выполнения синтаксического анализа строк для определения года. Кроме всего прочего, синтаксис года зависит от языкового стандарта, что может осложнить ситуацию для сред, в которых сценарии используются коллективно. Заметим также, что с появлением дополнительных требований (например, удалить файлы, последний раз сохраненные до наступления текущего года) сценарии будут становиться все более громоздкими и сложными для восприятия. Должен существовать более удобный путь. Давайте посмотрим, как подобные задачи решает PowerShell.

Конвейер PowerShell

Как уже говорилось, стандартный выход и стандартный вход — это средство, позволяющее командным оболочкам на базе текста (например, Cmd.exe) реализовать конвейерную передачу текстовых данных между программами. Конвейер PowerShell использует ту же основную схему, в рамках которой выход одной команды подается на вход другой команды, с той лишь разницей, что в этом случае выход и вход — это объекты, а не текст. При своей принципиальной простоте данная концепция имеет далеко идущие результаты.

Фильтрация с помощью Where-Object

Рассмотрим предыдущий пример: задача вывода списка файлов *.txt, в последний раз записанных в текущем году. В PowerShell это делается путем извлечения объектов файловой системы (Get-ChildItem) и выбора (Where-Object) только тех из них, у которых значением свойства LastWriteTime является текущий год:

Эту команду можно записать в одну строку, но я разбил ее на несколько строк, чтобы облегчить восприятие. Код между фигурными скобками <> называется блоком сценария. В блоке сценария Where-Object переменная $_ означает «текущий объект с конвейера». Таким образом, данная команда предписывает «взять объекты файловой системы, относящиеся к типу *.txt (Get-ChildItem *.txt) и вывести из них только те, у которых (Where-Object) год последнего сохранения ($_.LastWriteTime.Year) равен (-eq) текущему году ((Get-Date).Year)».

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

Теперь предположим, что требуется удалить файлы, последнее сохранение которых выполнялось до начала текущего года. Чтобы решить эту задачу, достаточно немного изменить фильтр и подать результат по конвейеру на вход Remove-Item:

Все, что мы изменили, — использовали -lt (меньше) вместо -eq (равно), а затем после символа конвейера добавили команду Remove-Item.

В этих двух командах PowerShell вместо передачи текстовых строк между командами передаются объекты: файл — это объект; дата его последнего сохранения — тоже объект.

Выполнение действий с помощью ForEach-Object

Помимо фильтрации с помощью Where-Object, для каждого объекта, проходящего по конвейеру, можно выполнить определенное действие с помощью ForEach-Object. Подобно Where-Object, команда ForEach-Object использует блок сценария и переменную $_, представляющую текущий объект на конвейере.

Для примера предположим, что нам требуется вывести полный путь и имя каждого файла *.txt. Команда, позволяющая решить эту задачу, выглядит так:

Выход этой команды — полный путь и имя каждого файла *.txt. Конечно, внутри блока сценария можно выполнить много других действий. Например, записать имена, а затем удалить файлы *.log из каталога C:\Logs позволяет такая команда:

Get-ChildItem C:\Logs\*.log |
ForEach-Object <
«Removing $($_.FullName)»
Remove-Item $_
> | Out-File C:\Logs\Cleanup.txt -Append

Эта команда выводит текстовую строку «Удаление », а затем удаляет файл (Remove-Item). Все выведенные строки записываются в файл C:\Logs\Cleanup.txt.

Фильтрацию (Where-Object) можно комбинировать с действиями (ForEach-Object) для построения еще более гибких команд. Например, удалить файлы *.log старше шести месяцев и записывать имя каждого из них перед удалением позволяет следующая команда:

Даже если вы не являетесь экспертом по PowerShell, примерное понимание изложенных выше основ объектов и конвейера позволит вам разобраться, как работают эти команды PowerShell.

Мощь конвейера

Конвейер — это краеугольный камень, открывающий возможность реализации всего богатства функций PowerShell. Поэкспериментировав с описанными выше примерами, вы обнаружите, что PowerShell упрощает сложные задачи намного эффективнее, чем это возможно в Cmd.exe. Получить дополнительную информацию и ознакомиться с другими примерами можно в разделе справки PowerShell, посвященном конвейерам (https://technet.microsoft.com/en-us/library/hh847902.aspx).

Поделитесь материалом с коллегами и друзьями

Оцените статью