Программирование в командной строке windows 10

Программирование в Cmd введение для новичков Программирование в Cmd (введение для новичков) Это всего лишь введение в команды cmd, не судите строго, статья писалась для Новиков, та и многим другим я думаю пригодиться =) Наверно многие и не подозревают, что cmd это универсальная оболочка, которая п

Программирование в Cmd (введение для новичков)

Это всего лишь введение в команды cmd, не судите строго, статья писалась для Новиков, та и многим другим я думаю пригодиться =)
Наверно многие и не подозревают, что cmd это универсальная оболочка,
которая позволяет не просто администрировать систему, но и программировать!
Конечно уровень языка не столь высок, как например с , но все же…

Для начала, напишем маленькую программку, которая будет выводить строчку, записанную в переменную.
Заходим на диск С: и создаем там что то типа program_1.cmd (можно *.bat)
открываем его блокнотом и вписываем туда следующие строки:

rem программа_1
cls
@echo off
color 0A
set string=Hellow World!!!
echo %string%

rem — используеться для описния коментариев
cls — если кто еще незнает, это отчистка экрана
@echo off — выключаем отображение команд на экране. Обратите внимание на @
перед ECHO! Она предотвращает эхо-отображения команд в отдельной строке.
color 0A — задаем цвет фона и текста
set string=Hellow World!!! — set используется для описания переменных
echo %string% — вывод на экран переменной, обратите внимание на %%, это
обозначает, что это действительно переменная, а не строка!
С кодом разобрались, теперь посмотрим на исход программы! Запускаем ее на выполнение через cmd:
program_1.cmd
Результат выполнения будет, как вы догадались Hellow World!!! Ярко-зелеными буквами на черном фоне

Теперь немножко усложним задачку, добавим в этот код условие!

rem программа_2
cls
@echo off
color 0A
set a=1
set timer=10
if %a%==1 (shutdown /r -t %timer% -c «Вас похекали»
) else (echo a!=1)

Я думаю вы уже догадались что будет на выводе. Мы сравниваем значение записанное в переменную “а” с 1, если условие истина, то компьютер перезагрузиться через 10 секунд, в ином случае на вывод подается надпись, что a!=1. Пример банален и прост,
ну зато понятен для многих.

А теперь перейдем непосредственно к циклам. Рассмотрим самый элементарный пример:

rem программа_3
cls
@echo off
color 0A
for /l %B in (0,1,10) do echo %B

данная программа выведет в столбик цифры, от 0 до 10 с шагом 1 =) все просто, как …
А теперь немного сложнее, for может использоваться в более весомых целях,
например для перебора файлов, для примера можете написать в cmd:

for %B in (C:*.cmd) do (echo %B)

В ответ вы получите все ваши программки с расширением *.cmd

Также циклом for можно перебрать каталоги, к примеру

for /d %B in (C:*) do echo %B

Покажет все каталоги на диске С: (Обратите внимание, только каталоги, а не подкоталоги!)
А теперь напишем существенную программу, которая будет из базы выбирать емейлы и записывать их в другой файл.

(for /f «tokens=1-5» %A in (users.txt) do @echo %D) > emails.txt

К примеру, база у нас «идеальная», типа:

Vasya Pupkin heck 111@mail.ru 81231111111
Dima Ivanov lamer 222@mail.ru 81232222222
Genya Petrov lamer 333@mail.ru 81233333333
Egor Sidorov lamer 444@mail.ru 81234444444
Anton Popovich lamer 555@mail.ru 81235555555
Kostya Terentev lamer 666@mail.ru 81236666666
Vanya Onisenko lamer 777@mail.ru 81237777777
Misha Loshenko lamer 888@mail.ru 81238888888
Vlad Sorochinskiy lamer 999@mail.ru 81239999999

Мы с помощью цикла перебираем все слова, и записываем 4(%D) в файл emails.txt =)

Что же еще можно сделать с cmd?

Опишу свой пример. Я занимаюсь созданием веб-сайтов, которые используют базу данных mysql. С базой я работаю через консоль, для меня привычнее. Что б не париться я написал небольшую программку mysql.cmd которая к ней будет подключаться:

PHP код:
v:
cd usrlocalmysql4bin
mysql.exe -u root –p pass

v – виртуальный диск на котором стоит денвер
root – имя пользователя
pass – пароль пользователя

Нам остается ее запустить и наслаждаться работой с базой
PS Ну вот собственно и все! Статья получилось маленькой, но я все же надеюсь, что она кому то будет полена =)


Загрузить PDF


Загрузить PDF

Чтобы выполнить описанные в этой статье шаги, сначала запустите Блокнот; для этого нажмите «Пуск» > «Выполнить» и введите «notepad». Сверните окно Блокнота и откройте командную строку; для этого нажмите «Пуск» > «Выполнить» и введите «CMD».

Шаги

  1. Изображение с названием Use the Command Prompt and Write in Batch Language Step 1

    1

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

    • Щелкните правой кнопкой мыши по синей полосе вверху окна командной строки и в меню выберите «Свойства». Теперь в разделе «Правка» вкладки «Общие» установите флажок у «Быстрая правка». Нажмите OK. Откроется окно с вопросом, хотите ли вы применить или сохранить изменения. Установите флажок у «Сохранить параметры для окон с таким же названием» и нажмите OK.
  2. Изображение с названием Use the Command Prompt and Write in Batch Language Step 2

    2

    Уясните, что делать дальше. Скорее всего, сейчас вы думаете, что своими действиями повредите систему — это возможно, если не знать, что делать. Поэтому сначала научитесь перемещаться между каталогами.

    • Введите CD c: и нажмите Enter. Вы перейдете из текущего каталога в корневой каталог диска C:. Далее мы научим вас отображать все файлы и папки, которые находятся в этом каталоге.
    • Введите DIR и нажмите Enter. На экране отобразится список файлов и папок. В последнем столбце вы найдете имена каталогов, ответвляющихся от корневого каталога диска C: (или от каталога, в котором вы находитесь в данный момент). Если это папка, вы увидите <dir> в столбце слева от столбца с именем в той же строке. Если это файл, возле него вы не увидите <dir>, но найдете расширение файла (*.txt, *.exe, *.docx) в конце имени файла.
  3. 3

    Создайте папку, в которую скопируете все свои пакетные файлы. Введите MKDIR mybatch. Будет создана папка «mybatch». Чтобы проверить это, введите DIR еще раз и найдите эту папку в отобразившемся списке.

  4. 4

    Изображение с названием Use the Command Prompt and Write in Batch Language Step 4

  5. Изображение с названием Use the Command Prompt and Write in Batch Language Step 5

    5

    Запомните, как пользоваться командой «ping». Если компьютер не подключен к интернету, пропустите это шаг. Команда «Ping» отправляет пакеты данных на указанный сайт и принимает ответы с сайта; если это так, сайт работает нормально.

    • Например, проверим, работает ли сайт google.com. Введите PING Google.com и нажмите Enter. На экране отобразится что-то вроде «Ответ от 72.14.207.99: число байт = 32 время = 117мс TTL = 234». Таких строк может быть около четырех. Если на экране отобразилось сообщение об ошибке, не работает либо ваше интернет-соединение, либо веб-сайт. Также будет указано, сколько пакетов отправлено, получено и потеряно. Если потеряно 0 пакетов, веб-сайт работает на 100 %.
  6. Изображение с названием Use the Command Prompt and Write in Batch Language Step 6

    6

    Запустите программу из папки Windows/System32. Например, введите mspaint.exe, чтобы запустить программу Paint. Труднее открыть программу, которая находится в определенном каталоге, как вы уже сделали с командной строкой и Блокнотом с помощью графического интерфейса пользователя.

    • Запустите программу или откройте файл, которые находятся в каталоге. Перейдите в запущенный Блокнот и введите Привет, мир!. Затем нажмите «Файл» > «Сохранить как», в строке «Имя файла» введите «Helloworld.txt» и сохраните файл в папке «mybatch» на диске C:. Перейдите в командную строку, и вы окажетесь в папке «Documents and setting». Теперь введите cd c:mybatch, нажмите Enter, а затем введите helloworld.txt. Обычно командную строку еще раз отрывать не нужно, но здесь все немного сложнее, потому что вы не переходите сразу в каталог «C:».
  7. Изображение с названием Use the Command Prompt and Write in Batch Language Step 7

    7

    Создайте папку «deleteme» в каталоге «C:». Чтобы удалить папку, используйте команду RMDIR. Например, введите RMDIR deleteme, чтобы удалить папку «deleteme». Эта команда удаляет файлы, папки и подпапки.

    • Совет: когда будете пользоваться командой RMDIR, перейдите в папку с файлом или подпапкой, которые хотите удалить, а затем введите RMDIR *, где вместо «*» введите имя удаляемых файла или папки. Перейдите на диск C: и введите RMDIR deleteme. Система поинтересуется, хотите ли вы удалить папку. Нажмите клавиши Y > Enter. Так вы удалите папку «deleteme».
  8. 8

    Переименуйте файл или папку. Для это воспользуйтесь любой из двух команд: REN и RENAME. Создайте папку «idon’tlikemyname», а затем введите REN idon’tlikemyname mynameisgood. Папка будет переименована. Теперь ее можно удалить.

  9. 9

    Изображение с названием Use the Command Prompt and Write in Batch Language Step 8

  10. Изображение с названием Use the Command Prompt and Write in Batch Language Step 9

    10

    Разберитесь с пакетным программированием и напишите программу в Блокноте. Для этого не нужно покупать дорогую программу — все можно сделать бесплатно. В блокноте введите:

      @echo off
      Echo Это пакетный файл,
      Echo который отображает время
      Echo Текущее время
      Time /t
      
    • На экране отобразятся три предложения. При этом сами команды вы не увидите — это благодаря команде @echo off. Без этой команды на экране отобразятся текст и команды, например, так:
    • Команда time /t выведет на экран текущее время. Обязательно добавьте параметр «/t» — в противном случае система попросит вас ввести время.
    • Нажмите «Файл» > «Сохранить как», в строке «Имя файла» введите «Timefirst.bat» и сохраните файл в папке «mybatch». Обратите внимание, что вы сохранили файл в формате BAT, а не как текстовый файл (ТХТ-файл). Это формат пакетных файлов, которые не работают без расширения «.bat».

    Реклама

Советы

  • Чтобы вывести на экран список всех команд, введите «help».

Реклама

Предупреждения

  • Если вы не знаете, что делаете, вы можете повредить систему.
  • Используя команду DEL (или DELETE), помните, что файлы/папки удаляются навсегда, то есть в Корзину не попадают.

Реклама

Об этой статье

Эту страницу просматривали 19 634 раза.

Была ли эта статья полезной?

В данной статье будут рассмотрены основы командной строки Windows, а именно:

  • Понятие командной строки;
  • Справочник по командам командной оболочки;
  • Последовательность событий при выполнение команды;
  • Создание сценариев командной строки;
  • Управление отображением текста и команд;
  • Команды для изучение системной информации;
  • Команды для использования реестра;
  • Управление системными службами;
  • Перезагрузка и выключение систем из командной строки;
  • Управление приложениями и  процессами из командной строки.

Содержание

  1. Понятие командной строки
  2. Краткий справочник по командам командной оболочки (Cmd.exe)
  3. Последовательность событий при выполнение команды
  4. Создание сценариев командной строки
  5. Управление отображением текста и команд
  6. Изучение системной информации
  7. Команды для использования реестра
  8. Управление системными службами
  9. Перезагрузка и выключение систем из командной строки
  10. Управление приложениями, процессами и производительностью

Понятие командной строки

Поддержка командной строки встроена в операционную систему Microsoft Windows и доступна через окно командной оболочки. Командная строка поддерживается во всех версиях Windows и служит для запуска встроенных команд, утилит и сценариев. Несмотря на мощь и гибкость командной строки, некоторые администраторы Windows никогда ее не используют. Если вам хватает графических средств администрирования, можно применять только их, щелкая мышью элементы пользовательского интерфейса.

Однако опытные администраторы Windows, квалифицированные специалисты по технической поддержке и «продвинутые» пользователи не могут обойтись без командной строки. Зная, как правильно применять командную строку, в частности, какие средства командной строки выбрать, как и когда их использовать, чтобы они работали эффективно, можно избежать многочисленных проблем и добиться четкого выполнения операций. Если вы занимаетесь поддержкой нескольких доменов или сетей, то для автоматизации ежедневных операций не только важно, но и необходимо иметь представление об экономящих время способах работы с командной строкой.

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

Среду командной оболочки Windows запускают разными способами, в частности указывая параметры при запуске Cmd.exe или используя собственный стартовый файл, хранящийся в каталоге %SystemRoot%System32.

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

Работая с командной строкой Windows, Вы должны понимать, откуда берутся используемые Вами команды. «Родные» команды (встроенные в операционную систему) бывают двух видов:

  • Внутренние – существуют внутри командной оболочки, у них нет отдельных исполняемых файлов;
  • Внешние — реализованы в отдельных исполняемых файлах, которые обычно хранятся в каталоге %SystemRoot% System32.

Краткий справочник по командам командной оболочки (Cmd.exe)

  • assoc — выводит или изменяет сопоставления (associations) типов файлов;
  • break — задает точки останова при отладке
  • call — вызывает из сценария процедуру или другой сценарий;
  • cd (chdir) — показывает имя текущего каталога или выполняет смену текущего каталога;
  • cls — очищает окно командной строки и буфер экрана;
  • color — задает цвета текста и фона окна командной оболочки;
  • сору — копирует файлы или выполняет конкатенацию файлов;
  • date — показывает или устанавливает текущую дату;
  • del (erase) — удаляет заданный файл, группу файлов или каталог;
  • dir — показывает список подкаталогов и файлов в текущем или заданном каталоге;
  • echo — выводит текст в окно командной строки или задает, надо ли отображать команды на экране (on|off);
  • endlocal — отмечает конец локализации (локальной области видимости) переменных;
  • exit — выход из оболочки командной строки;
  • for — выполняет заданную команду для каждого файла в наборе;
  • ftype выводит или изменяет текущие типы файлов в сопоставлениях расширений файлов с программами;
  • goto — указывает, что интерпретатор команд должен перейти на строку с заданной меткой в пакетном сценарии;
  • if — выполняет команды по условию;
  • md (mkdir) — создает подкаталог в текущем или заданном каталоге;
  • move — перемещает файл или группу файлов из текущего или заданного исходного каталога в указанный каталог. Также может переименовывать каталог;
  • path — показывает или задает путь к командам, используемый операционной системой при поиске исполняемых файлов и сценариев;
  • pause — останавливает выполнение пакетного файла и ожидает ввода с клавиатуры;
  • popd — делает текущим каталог, имя которого было сохранено командой PUSHD;
  • prompt — указывает, какой текст должен показываться в строке приглашения;
  • pushd — сохраняет имя текущего каталога и при необходимости делает текущим заданный каталог;
  • rd (rmdir) — удаляет каталог или каталог вместе с его подкаталогами;
  • rem — помечает комментарии в пакетном сценарии или Config.nt;
  • ren (rename) — Переименовывает файл или группу файлов;
  • set — показывает текущие переменные окружения или задает временные переменные для текущей командной оболочки;
  • setlocal — отмечает начало локализации (локальной области видимости) переменных в пакетных сценариях;
  • shift — сдвигает позицию замещаемых параметров в пакетных сценариях;
  • start — запускает заданную программу или команду в отдельном окне;
  • time — показывает или устанавливает системное время;
  • title — задает заголовок окна командной оболочки;
  • type — показывает содержимое текстового файла;
  • verify — включает режим проверки файлов после записи на диск;
  • vol — показывает метку и серийный номер дискового тома.

Синтаксис любой внутренней команды (и большинства внешних) можно получить, введя в командной строке имя команды и /?, например:

   
   copy /?

Командная оболочка — весьма мощная среда работы с командами и сценариями. В командной строке можно запускать команды разных типов: встроенные команды, утилиты Windows и версии приложений, рассчитанные на командную строку. Независимо от типа каждая команда, которую вы будете использовать, должна соответствовать одним и тем же синтаксическим правилам. Согласно этим правилам, за именем команды идут обязательные или необязательные аргументы. Кроме того, аргументы могут использовать перенаправление ввода, вывода или стандартных ошибок.

Последовательность событий при выполнение команды

  • Командная оболочка заменяет любые переменные, введенные в тексте команд, их текущими — значениями;
  • Если введена группа или цепочка из нескольких команд, строка разбивается на отдельные команды, которые в свою очередь разбиваются на имя и аргументы команды. Далее команды обрабатываются по отдельности;
  • Если в имени команды указан путь, командная оболочка ищет команду по этому пути. Если в указанном каталоге такой команды нет, командная оболочка возвращает ошибку;
  • Если в имени команды не задан путь, командная оболочка сначала пытается разрешить имя команды на внутреннем уровне. Если найдена внутренняя команда с таким именем, значит, вызвана внутренняя команда, которую сразу же можно выполнить. Если внутренней команды с таким именем нет, командная оболочка сначала ищет исполняемый файл команды в текущем каталоге, а затем в каталогах, перечне в переменной окружения PATH. Если файла команды нет ни в одном из этих каталогов, командная оболочка возвращает ошибку;
  • Если команда найдена, она выполняется с заданными аргументами и при необходимости ввод считывается из источника, указанного в этих аргументах. Вывод и ошибки команд показываются в окне командной строки или направляются заданному приемнику вывода и ошибок.
  • Как видите, на выполнение команд влияют многие факторы, в том числе пути к командам, перенаправление ввода-вывода, группирование или создание цепочек команд.

При работе с командной оболочкой Вы, вероятно, запускали ее, открывая меню Start (Пуск) и выбирая Programs (Программы) или All Programs (Все программы), затем Accessories (Стандартные) и Command Prompt (Командная строка). Другие способы запуска командной строки — диалоговое окно Run (Запуск программы) или ввод cmd в другом, уже открытом окне командной оболочки. Эти способы позволяют при запуске командной строки указывать аргументы: ключи, управляющие работой командной строки, и параметры, инициирующие выполнение дополнительных команд. Например, можно запустить командную оболочку в «молчаливом» режиме (т. е. отключить эхо-вывод) командой cmd /q или сделать так, чтобы командная оболочка выполнила заданную команду и завершила свою работу, — для этого нужно ввести cmd /с, а затем текст команды в кавычках.

В следующем примере командная оболочка запускается, выполняет команду ipconfig с выводом результатов в файл и завершается:

   
   cmd /c "ipconfig > c:ipconfig.txt"

Создание сценариев командной строки

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

Поскольку сценарии состоят из стандартных текстовых символов, их можно создавать и редактировать в любом стандартном текстовом редакторе, скажем, в Notepad (блокнот). Вводя команды, убедитесь, что каждая команда или группа команд, которые должны выполняться совместно, разметаются с новой строки. Это обеспечит их корректное выполнение. Закончив создание сценария командной строки, сохраните файл сценария с расширением .bat или .cmd. Оба расширения работают одинаково. Например, если вам надо создать сценарий для вывода имени системы, версии Windows и конфигурации IP, включите в файл SysInfo.bat или SysInfo.cmd следующие три команды:

  
  hostname
  ver
  ipconfig -all

Управление отображением текста и команд

Команда ECHO служит двум целям: для записи текста в вывод (например, в окно командной оболочки или текстовый файл) и для включения/выключения эхо-отображения команд. Обычно при выполнении команд сценария сами команды и вывод этих команд отображаются в консольном окне. Это называется эхо-отображением команд (comand echoing).

Чтобы использовать команду ECHO для отображения текста, введите echo и текст, который надо вывести:

  
  echo The system host name Is: hostname

Чтобы с помощью ECHO управлять эхо-отображением команд, введите echo off или echo on, например:

  
  echo off
  echo The system host name is:
  hostname

Чтобы направить вывод в файл, а не в окно командной оболочки, используйте перенаправление вывода, например:

Курс по SQL для начинающих

  
  echo off
  echo The system host name is: > current.txt
  hostname » current.txt

Теперь посмотрим, как подавляется эхо-отображение команд. Запустите командную оболочку, введите echo off, затем другие команды. Вы увидите, что приглашение командной строки больше не выводится. Вместо него появляется только то, что набирается в консольном окне, и вывод выполненных команд. В сценариях команда ECHO OFF отключает эхо-отображение команд и приглашение командной строки. Добавляя в свои сценарии команду ECHO OFF, вы предотвращаете загромождение окна командной оболочки или файла текстом команд, если Вас интересует лишь вывод от этих команд.

Изучение системной информации

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

  • NOW — отображает текущую системную дату и время в 24-часовом формате, например Sal May 9 12:30:45 2003. Доступна только в Windows Server 2003 Resource Kit;
  • WHOAMI — сообщает имя пользователя, зарегистрированного в системе на данный момент, например adatumadmi-nistrator;
  • WHERE — выполняет поиск файлов по шаблону поиска (search pattern) и возвращает список совпавших результатов.

Чтобы использовать NOW или WHOAMI, просто введите команду в окне командной оболочки и нажмите Enter. Наиболее распространенный синтаксис для WHERE выглядит так:

  
  where /r базовый_каталог_имя_файла

Здесь параметр /r указан для рекурсивного поиска, начиная от указанного каталога (базовый_каталог) и включая все его подкаталоги, а имя_файла — полное или частичное имя искомого файла, которое может включать символы подстановки (wildcards): знак ? заменяет один символ, а знак * — группу символов, например data???.txt или data*.*. В следующем примере в каталоге С: и всех его подкаталогах выполняется поиск всех текстовых файлов, имена которых начинаются с data.

   
  where /r C: data*.txt

Также можно найти файлы всех типов, имена которых начинаются с data:

   
  where /r C: data*.*

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

  • DRIVERQUERY — выводит список всех установленных драйверов устройств и их свойства, в том числе имя модуля (module name), отображаемое имя (display name), тип драйвера и дату сборки (driver link date). В режиме отображения всей информации (/V) сообщается статус (status) и состояние (state) драйвера, режим запуска, сведения об использовании памяти и путь в файловой системе. Параметр /V также включает вывод детальной информации обо всех неподписанных драйверах.
  • SYSTEMINFO — выдает подробную информацию о конфигурации системы, в том числе сведения о версии, типе и изготовителе операционной системы, процессоре, версии BIOS, объеме памяти, региональных стандартах, часовом поясе и конфигурации сетевого адаптера.
  • NLSINFO — отображает подробную информацию о региональных стандартах, включая язык по умолчанию (default language), кодовую страницу Windows, форматы отображения времени и чисел, часовой пояс и установленные кодовые страницы. Эта команда доступна лишь в Windows Server 2003 Resource Kit.

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

Команды для использования реестра

Реестр Windows хранит конфигурационную информацию операционной системы, приложений, пользователей и оборудования. Эти данные содержатся в разделах (keys) и параметрах (values) реестра, которые размещаются в определенном корневом разделе (root key), который контролирует, как и когда используются разделы и параметры.

Если Вы знаете пути к разделам и понимаете допустимые типы данных в разделах, то можете использовать команду REG для просмотра разделов и параметров и манипуляций над ними самыми разнообразными способами. REG поддерживает несколько подкоманд:

  • REG add — добавляет в реестр новый подраздел или элемент;
  • REG delete — удаляет из реестра подраздел или элемент;
  • REG query — выводит список элементов раздела и имена подразделов (если они есть);
  • REG compare — сравнивает подразделы или элементы реестра;
  • REG сору — копирует элемент реестра по указанному пути раздела на локальной или удаленной системе;
  • REG restore — записывает в реестр ранее сохраненные подразделы, элементы и параметры;
  • REG save — сохраняет копию указанных подразделов, элементов и параметров реестра в файл.

Управление системными службами

Службы обеспечивают ключевые функции рабочих станций и серверов. Для управления системными службами на локальных и удаленных системах используется команда контроллера служб (service controller command) SC, имеющая набор подкоманд, ниже описывается лишь их часть:

  • SC config — настройка учетных записей регистрации и запуска служб;
  • SC query — вывод списка всех служб, настроенных на компьютере;
  • SC qc — отображение конфигурации определенной службы;
  • SC start — запуск служб;
  • SC stop — остановка служб;
  • SC pause — приостановка работы служб;
  • SC continue — возобновление работы служб;
  • SC failure — задание действий, выполняемых при сбое службы;
  • SC qfailure — просмотр действий, выполняемых при сбое службы.

Во всех командах можно указывать имя удаленного компьютера, со службами которого Вы хотите работать. Для этого вставьте UNC-имя или IP-адрес компьютера перед используемой подкомандой. Вот синтаксис:

  
  sc ИмяСервера Подкоманда

Перезагрузка и выключение систем из командной строки

Системы нередко приходится перезагружать или выключать. Один из способов — использовать для этого утилиту Shutdown, которая позволяет работать с локальной и удаленными системами. Другой способ управлять выключением или перезагрузкой системы — назначить задание для выключения. Здесь можно использовать Schtasks, чтобы указать время выключения, или создать сценарий со списком команд выключения для индивидуальных систем.

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

Выключение локальной системы:

  
  shutdown /s /t ЗадержкаВыключения /1 /f

Перезагрузка локальной системы:

  
  shutdown /r /t ЗадержкаВыключения /1 /f

Управление приложениями, процессами и производительностью

Всякий раз, когда операционная система или пользователь запускает службу, приложение или команду, Microsoft Windows запускает один или более процессов для управления соответствующей программой. Несколько утилит командной строки упростят вам мониторинг программ и управление ими. К этим утилитам относятся:

  • Pmon (Process Resource Manager) — показывает статистические данные по производительности, включая использование памяти и процессора, а также список всех процессов, выполняемых в локальной системе. Позволяет получать детальные «снимки» задействованных ресурсов и выполняемых процессов. Pmon поставляется с Windows Resource Kit;
  • Tasklist (Task List) — перечисляет все выполняемые процессы по имени и идентификатору процесса, сообщает информацию о сеансе пользователя и занимаемой памяти;
  • Taskkill (Task Kill) — останавливает выполнение процесса, заданного по имени или идентификатору. С помощью фильтров можно останавливать процессы в зависимости от их состояния, номера сеанса, процессорного времени, занимаемой памяти, имени пользователя и других параметров.

Вот в принципе все, что я хотел рассказать об основах командной строки Windows.

Материалы по курсу «Основы программирования»

Работа в текстовой оболочке операционной системы (ОС)

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

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

Текстовые оболочки допускают как интерактивный режим — пользователь вводит
команды и наблюдает их результат, так и «пакетный» (batch) — пользователь
может создать файл со списком команд, которые будут выполняться автоматически.
Кроме того, в текстовых оболочках присутствуют средства, позволяющие
комбинировать работу нескольких программ — вывод одной программы связывать
со входом другой.

На сегодняшней лекции мы будем рассматривать основные команды и принципы
работы в оболочках cmd.exe на Windows и Bash на Linux и macOS.

Для запуска оболочки cmd.exe на Windows нужно найти пункт меню «Командная
строка» в группе «Служебные — Windows» в меню «Пуск»:

  • «Пуск» → «Служебные — Windows» → «Командная строка» (Windows 10)
  • «Пуск» → «Программы» → «Служебные» → «Командная строка (Windows 7)

Для запуска оболочки на Linux и macOS нужно найти приложение «Терминал» или
«Консоль» (в разных дистрибутивах Линукса оно может называться по-разному)

Командная строка Windows:

win-console.png

Командная строка Linux или macOS (выглядит примерно так):

posix-console.png

У оболочки есть так называемое приглашение — место на экране для ввода
команды. В командной строке Windows приглашение выглядит так:

В нём отображается путь к текущей папке (у оболочки, как и у любой другой
программы, есть текущая папка) и знак >. Пользователь вводит команды после
знака >.

В оболочке Bash (используемой по умолчанию на Linux и macOS), приглашение
выглядит так:

mazdaywik@Mazdaywik-NB10:~$

В нём отображается имя текущего пользователя, имя компьютера, знак :,
путь к текущей папке (знаком ~ отображается домашняя папка) и знак $,
после которого пользователь вводит команды.

Команды оболочки позволяют перемещаться по папкам, манипулировать файлами
(копировать, переименовывать, перемещать, удалять) и запускать другие
программы. Команды в Командной строке Windows и Bash различаются.

Общий синтаксис команды:

‹команда› ‹параметр1› ‹параметр2›…

Здесь ‹команда› — это имя команды, параметры — указание режимов работы
команды и имён файлов, которыми команда манипулирует. Бывают команды, которые
вообще не принимают параметры.

Имя команды отделяется от параметров пробелом, сами параметры тоже разделяются
пробелами. Если имя команды или параметр сам должен содержать пробелы, то он
заключается в кавычки: "двойные" (работают и на Windows, и на Linux/macOS)
или 'одинарные' (работают только на Linux/macOS).

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

Основные команды оболочки

Смена текущей папки, cd

cd ‹имя папки›, работает и на Windows, и на Linux, и на macOS.

C:UsersMazdaywik>cd Desktop

C:UsersMazdaywikDesktop>
mazdaywik@Mazdaywik-NB10:~$ cd example
mazdaywik@Mazdaywik-NB10:~/example$

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

Создание папки, mkdir

Для того, чтобы создать новую пустую папку, используется команда mkdir:

На Windows вместо mkdir можно использовать более короткий синоним md,
на Linux и macOS — только mkdir.

mazdaywik@Mazdaywik-NB10:~$ mkdir "New folder"
mazdaywik@Mazdaywik-NB10:~$ cd "New folder"
mazdaywik@Mazdaywik-NB10:~/New folder$
C:UsersMazdaywik>mkdir "New folder"

C:UsersMazdaywik>cd "New folder"

C:UsersMazdaywikNew folder>

Создание текстового файла

На Windows для создания текстового файла используется команда вида

после чего с клавиатуры нужно ввести содержимое файла. Ввод завершается
нажатием клавиш Ctrl-Z и Enter.

На Linux и macOS нужно ввести команду

ввести содержимое файла и нажать комбинацию клавиш Ctrl-D.

C:UsersMazdaywikNew folder>copy con "new file.txt"
first line
second line
third line
^Z
Скопировано файлов:         1.

C:UsersMazdaywikNew folder>
mazdaywik@Mazdaywik-NB10:~/New folder$ cat > "new file.txt"
first line
second line
third line
mazdaywik@Mazdaywik-NB10:~/New folder$

Просмотр содержимого папки

На Windows используется команда dir, которая распечатывает содержимое
папки, выводя сведения о каждом файле. Если команду вызвать с параметром /b,
будут выведены только имена файлов. В папке New folder на данный момент
всего один файл:

C:UsersMazdaywikNew folder>dir
 Том в устройстве C имеет метку System
 Серийный номер тома: 0052-DDD1

 Содержимое папки C:UsersMazdaywikNew folder

09.04.2022  14:33    <DIR>          .
09.04.2022  14:33    <DIR>          ..
09.04.2022  14:33                37 new file.txt
               1 файлов             37 байт
               2 папок  43 388 399 616 байт свободно

C:UsersMazdaywikNew folder>dir /b
new file.txt

C:UsersMazdaywikNew folder>

На Linux и macOS используется команда ls, которая распечатывает имена
файлов в папке. Если указать параметр -l, то будут распечатаны подробные
сведения:

mazdaywik@Mazdaywik-NB10:~/New folder$ ls
'new file.txt'
mazdaywik@Mazdaywik-NB10:~/New folder$ ls -l
total 4
-rw-r--r-- 1 mazdaywik mazdaywik 34 Apr  9 14:34 'new file.txt'
mazdaywik@Mazdaywik-NB10:~/New folder$

Копирование файлов

На Windows используется команда

copy ‹исходный файл› ‹имя копии›
copy ‹исходный файл› ‹целевая папка›

На Linux и macOS:

cp ‹исходный файл› ‹имя копии›
cp ‹исходный файл› ‹целевая папка›

Для примера скопируем файл new file.txt в copy.txt:

C:UsersMazdaywikNew folder>copy "new file.txt" copy.txt
Скопировано файлов:         1.

C:UsersMazdaywikNew folder>dir
 Том в устройстве C имеет метку System
 Серийный номер тома: 0052-DDD1

 Содержимое папки C:UsersMazdaywikNew folder

09.04.2022  14:41    <DIR>          .
09.04.2022  14:41    <DIR>          ..
09.04.2022  14:33                37 copy.txt
09.04.2022  14:33                37 new file.txt
               2 файлов             74 байт
               2 папок  43 390 611 456 байт свободно

Команда dir нам показала, что в папке теперь находятся два файла.
Имя файла new file.txt нужно было заключать в кавычки, т.к. оно содержит
пробел. Имя целевого файла copy.txt пробелов не содержит, поэтому кавычки
не нужны.

На Linux:

mazdaywik@Mazdaywik-NB10:~/New folder$ cp "new file.txt" copy.txt
mazdaywik@Mazdaywik-NB10:~/New folder$ ls -l
total 8
-rw-r--r-- 1 mazdaywik mazdaywik 34 Apr  9 14:43  copy.txt
-rw-r--r-- 1 mazdaywik mazdaywik 34 Apr  9 14:34 'new file.txt'
mazdaywik@Mazdaywik-NB10:~/New folder$

Переименование файлов

На Windows используется команда

ren ‹исходное имя› ‹новое имя›

На Linux и macOS:

mv ‹исходное имя› ‹новое имя›

Переименуем файл copy.txt в backup.txt:

C:UsersMazdaywikNew folder>ren copy.txt backup.txt

C:UsersMazdaywikNew folder>dir /b
backup.txt
new file.txt

C:UsersMazdaywikNew folder>
mazdaywik@Mazdaywik-NB10:~/New folder$ mv copy.txt backup.txt
mazdaywik@Mazdaywik-NB10:~/New folder$ ls
 backup.txt  'new file.txt'
mazdaywik@Mazdaywik-NB10:~/New folder$

Перемещение файлов

На Windows используется команда move:

move ‹исходный файл› ‹целевой файл›
move ‹исходный файл› ‹целевая папка›

на Linux и macOS — mv:

mv ‹исходный файл› ‹целевой файл›
mv ‹исходный файл› ‹целевая папка›

Таким образом, на Linux и macOS используется одна и та же команда и для
переименования, и для перемещения файлов.

Создадим папку nested в текущей папке и переместим в неё файл backup.txt:

C:UsersMazdaywikNew folder>mkdir nested

C:UsersMazdaywikNew folder>move backup.txt nested
Перемещено файлов:         1.

C:UsersMazdaywikNew folder>dir /b
nested
new file.txt

C:UsersMazdaywikNew folder>dir /b nested
backup.txt

C:UsersMazdaywikNew folder>

Мы создали папку nested, переместили в неё файл backup.txt, посмотрели
содержимое текущей папки и содержимое папки nested. Как видим, команда
dir может принимать имя папки, содержимое которой нужно распечатать. Если
имя не указано, то распечатывается содержимое текущей папки.

mazdaywik@Mazdaywik-NB10:~/New folder$ mkdir nested
mazdaywik@Mazdaywik-NB10:~/New folder$ mv backup.txt nested
mazdaywik@Mazdaywik-NB10:~/New folder$ ls
 nested  'new file.txt'
mazdaywik@Mazdaywik-NB10:~/New folder$ ls nested
backup.txt
mazdaywik@Mazdaywik-NB10:~/New folder$

На Linux и macOS команда ls также поддерживает указание имени папки,
которую нужно распечатать.

Удаление файлов

На Windows используется команда del или erase (это два синонима), которая
принимает имя удаляемого файла:

del ‹имя файла›
erase ‹имя файла›

На Linux и macOS такая команда называется rm:

Удалим файл backup.txt в папке nested:

C:UsersMazdaywikNew folder>del nestedbackup.txt

C:UsersMazdaywikNew folder>dir /b nested

C:UsersMazdaywikNew folder>
mazdaywik@Mazdaywik-NB10:~/New folder$ rm nested/backup.txt
mazdaywik@Mazdaywik-NB10:~/New folder$ ls nested
mazdaywik@Mazdaywik-NB10:~/New folder$

Команды dir /b и ls ничего не вывели, т.к. папки пустые.

Удаление папок

Для удаления папки используется команда rmdir на всех трёх рассматриваемых
операционных системах. На Windows можно использовать более короткий синоним
rd. Команда rmdir (rd) может удалить только пустой каталог, в противном
случае выдаст ошибку.

Удалим папку nested:

C:UsersMazdaywikNew folder>rmdir nested

C:UsersMazdaywikNew folder>dir /b
new file.txt

C:UsersMazdaywikNew folder>
mazdaywik@Mazdaywik-NB10:~/New folder$ rmdir nested
mazdaywik@Mazdaywik-NB10:~/New folder$ ls
'new file.txt'
mazdaywik@Mazdaywik-NB10:~/New folder$

Просмотр содержимого файла

Для того, чтобы вывести на экран содержимое файла, на Windows используется
команда type:

На Linux и macOS — cat:

Посмотрим содержимое файла new file.txt:

C:UsersMazdaywikNew folder>type "new file.txt"
first line
second line
third line

C:UsersMazdaywikNew folder>
mazdaywik@Mazdaywik-NB10:~/New folder$ cat "new file.txt"
first line
second line
third line
mazdaywik@Mazdaywik-NB10:~/New folder$

Очистка экрана

Чтобы стереть содержимое окна консоли, нужно выполнить команду cls
на Windows или clear на Linux/macOS.

Запуск консоли Python в консоли оболочки

На Windows, если Python установлен правильно, нужно ввести команду python,
на Linux и macOS — python3 (т.к. команда python без цифры на конце
может запустить Python 2.7 на некоторых дистрибутивах Linux или версиях macOS).

C:UsersMazdaywikNew folder>python
Python 3.9.5 (tags/v3.9.5:0a7dcbd, May  3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+2
3
>>> exit
Use exit() or Ctrl-Z plus Return to exit
>>> exit()

C:UsersMazdaywikNew folder>
mazdaywik@Mazdaywik-NB10:~/New folder$ python3
Python 3.8.10 (default, Mar 15 2022, 12:22:08)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+2
3
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
mazdaywik@Mazdaywik-NB10:~/New folder$

Завершение работы в оболочке

Команда exit (работает везде) закрывает окно оболочки.

Запуск программ на Python в оболочке

Для запуска программы на Python’е нужно выполнить в оболочке команду

python ‹имя исходного файла›
python3 ‹имя исходного файла›

в зависимости от операционной системы.

Напишем программу, которая распечатывает фразу Hello, World! и запустим её.

C:UsersMazdaywikNew folder>copy con hello.py
print('Hello, World!')
^Z
Скопировано файлов:         1.

C:UsersMazdaywikNew folder>python hello.py
Hello, World!

C:UsersMazdaywikNew folder>
mazdaywik@Mazdaywik-NB10:~/New folder$ cat > hello.py
print('Hello, World!')
mazdaywik@Mazdaywik-NB10:~/New folder$ python3 hello.py
Hello, World!
mazdaywik@Mazdaywik-NB10:~/New folder$

На Windows программы на Python можно запускать, просто указывая имя исходного
файла — интерпретатор Python будет вызываться автоматически:

C:UsersMazdaywikNew folder>hello.py
Hello, World!

C:UsersMazdaywikNew folder>

На Linux и macOS, чтобы так сделать, нужно выполнить дополнительные действия:
добавить в начало файла специальный комментарий

и пометить файл как исполнимый командной chmod +x.

mazdaywik@Mazdaywik-NB10:~/New folder$ cat > hello.py
#!/usr/bin/env python3

print('Hello, World!')
mazdaywik@Mazdaywik-NB10:~/New folder$ chmod +x hello.py
mazdaywik@Mazdaywik-NB10:~/New folder$ ./hello.py
Hello, World!
mazdaywik@Mazdaywik-NB10:~/New folder$

Одна из особенностей оболочек Linux и macOS — для запуска программ из текущей
папки нужно явно добавлять в начало ./, к этому надо привыкнуть.

Стандартные потоки ввода-вывода

В операционных системах (и в Windows, и в unix-подобных системах macOS и Linux)
для программ, запускаемых в консоли, доступны три стандартных потока
ввода-вывода — три псевдофайла, посредством которых программы могут
взаимодействовать с пользователем и друг с другом.

  • Стандартный ввод (условно называемый stdin) — по умолчанию связан с вводом
    с клавиатуры.
  • Стандартный вывод (stdout) — по умолчанию связан с выводом текста на экран,
    предназначен для вывода полезных данных программы.
  • Стандартный вывод ошибок (stderr) — тоже по умолчанию связан с экраном,
    предназначен для вывода сообщений об ошибках.

Если программа запрашивает пользовательский ввод, то, как правило, она читает
его из (псевдо)файла stdin, если печатает на экран — по умолчанию выводит
в (псевдо)файл stdout.

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

Для того, чтобы ввести конец файла в операционной системе Windows, нужно
нажать комбинацию клавиш Ctrl-Z (на экране высветится ^Z) и после этого
Enter. Для того, чтобы ввести конец файла в unix-подобных ОС, нужно нажать
Ctrl-D.

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

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

Для того, чтобы подменить пользовательский ввод на чтение текстового файла,
нужно к команде запуска программы добавить < «имя-файла.txt»:

program arg1 arg2... < input.txt

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

Рассмотрим следующую программу greeting.py:

name = input("Введите ваше имя:")
sirname = input("Введите вашу фамилию:")

print("Привет,", name, sirname)

(встроенная функция input() запрашивает ввод с клавиатуры)

Рассмотрим запуск программы обычным образом и с использованием
перенаправления ввода:

Z:>python greeting.py
Введите ваше имя:Александр
Введите вашу фамилию:Коновалов
Привет, Александр Коновалов

Z:>type input.txt
Alexander
Konovalov
Z:>python greeting.py < input.txt
Введите ваше имя:Введите вашу фамилию:Привет, Alexander Konovalov

Z:>

Первый запуск демонстрирует ввод данных с клавиатуры (stdin связан
с клавиатурой): я вводил свои имя и фамилию (завершая ввод каждой строки
нажатием на клавишу Enter, которая вводила и перевод строки тоже), набираемый
мною текст отображался на экране и считывался из stdin встроенной функцией
input().

Далее, при помощи команды type я показал, что в данной папке есть текстовый
файл input.txt с двумя строчками, в которых написаны, соответственно,
имя и фамилия (из-за особенностей Windows, кириллица может считываться неверно).

В третьей команде я связал стандартный ввод stdin с файлом input.txt,
в результате чего программа считывала данные не с клавиатурного ввода,
а из текстового файла — на экране видно только то, что она выводит,
но не считывает.

Можно считать, что при перенаправлении ввода стандартный ввод неявно считается
файлом, открытым в режиме r (для чтения).

Стандартный вывод можно перенаправить двумя способами: для перезаписи и для
дозаписи (сравни с режимами w и a функции open() в Python). Для того,
чтобы стандартный вывод перенаправить в файл в режиме перезаписи (если файла
не было, он будет создан, если файл был, его старое содержимое сотрётся),
нужно к команде запуска добавить > «имя-файла.txt», в режиме дозаписи (если
файл был, то новые данные будут добавляться в конец) — >> «имя-файла.txt»:

program arg1 arg2... > output.txt
program arg1 arg2... >> output.txt

Рассмотрим тот же пример:

Z:>python greeting.py
Введите ваше имя:Alexander
Введите вашу фамилию:Konovalov
Привет, Alexander Konovalov

Z:>python greeting.py > output.txt
Alexander
Konovalov

Z:>

В текущей папке появится файл output.txt со следующим содержимым:

Введите ваше имя:Введите вашу фамилию:Привет, Alexander Konovalov

Когда мы перенаправили вывод в файл output.txt, то, что программа до этого
выводила на экран (строчку Введите ваше имя: и т.д.), она стала выводить
в файл — свои имя и фамилию я писал практически наугад, не видя, что программа
меня спрашивает.

Дело в том, что в обоих случаях программа пишет в поток стандартного вывода
stdout, который, однако, в первом случае был связан с экраном, и мы видели,
что программа пишет, а во втором случае — с файлом, и на экран в результате
ничего не выводится (зато весь вывод попадает в файл).

Стандартный поток ошибок перенаправляют редко, для перенаправления используются
похожие команды, но перед знаками > и >> нужно указать цифру 2:

program arg1 arg2... 2>errors.txt
program arg1 arg2... 2>>errors.txt

Описанный выше синтаксис связывания связывания стандартных потоков с файлами
одинаково работает и в Windows, и в unix-подобных системах (macOS и Linux).

Связывать стандартные потоки можно не только с файлами, но и между собой.
Если у нас есть две программы, одна из которых (назовём её prog1) пишет
данные на stdout, а вторая (назовём её prog2) читает данные со стандартного
ввода (stdin), то их можно связать в конвейер:

Стандартный вывод stdout программы prog1 будет связан со стандартным
вводом stdin программы prog2, то, всё, что будет выводить первая программа,
будет считывать вторая программа.

В конвейере может быть сколько угодно команд:

prog1 | prog2 | prog3 | prog4

Здесь у команд prog2 и prog3 связаны и стандартные вводы, и стандартные
выводы.

В командной строке unix-подобных операционных систем имеется довольно много
встроенных команд, предназначенных для обработки текстовых данных (выбор
подстрок, сортировка строчек и т.д.), эти программы удобно комбинировать
при помощи конвейеров. Командная строка Windows гораздо беднее на эти
возможности.

Возьмём текстовый файл следующего содержимого:

jack.txt

«`
This is the house that Jack built.
This is the malt
That lay in the house that Jack built.
This is the rat, that ate the malt
That lay in the house that Jack built.
This is the cat,
That chased the rat, that ate the malt
That lay in the house that Jack built.
This is the dog, that worried the cat,
That chased the rat, that ate the malt
That lay in the house that Jack built.
This is the cow with the crumpled horn,
That tossed the dog, that worried the cat,
That chased the rat, that ate the malt
That lay in the house that Jack built.
This is the maiden all forlorn,
That milked the cow with the crumpled horn,
That tossed the dog, that worried the cat,
That chased the rat, that ate the malt
That lay in the house that Jack built.
This is the man all tattered and torn,
That kissed the maiden all forlorn,
That milked the cow with the crumpled horn,
That tossed the dog, that worried the cat,
That chased the rat, that ate the malt
That lay in the house that Jack built.
This is the priest all shaven and shorn,
That married the man all tattered and torn,
That kissed the maiden all forlorn,
That milked the cow with the crumpled horn,
That tossed the dog, that worried the cat,
That chased the rat, that ate the malt
That lay in the house that Jack built.
This is the cock that crowed in the morn,
That waked the priest all shaven and shorn,
That married the man all tattered and torn,
That kissed the maiden all forlorn,
That milked the cow with the crumpled horn,
That tossed the dog, that worried the cat,
That chased the rat, that ate the malt
That lay in the house that Jack built.
This is the farmer sowing his corn,
That kept the cock that crowed in the morn,
That waked the priest all shaven and shorn,
That married the man all tattered and torn,
That kissed the maiden all forlorn,
That milked the cow with the crumpled horn,
That tossed the dog, that worried the cat,
That chased the rat, that ate the malt
That lay in the house that Jack built.
«`

Для того, чтобы найти в нём все строки, в которых упоминается некоторая
строчка, на Windows нужно использовать команду find "искомая строка"
(кавычки обязательны), в unix-подобных системах — grep "искомая строка"
(кавычки нужны, если в искомой строке есть пробелы).

Для примера, найдём в файле слово dog:

Z:>find "dog" < jack.txt
This is the dog, that worried the cat,
That tossed the dog, that worried the cat,
That tossed the dog, that worried the cat,
That tossed the dog, that worried the cat,
That tossed the dog, that worried the cat,
That tossed the dog, that worried the cat,
That tossed the dog, that worried the cat,

Z:>

Программа find считывает строчки со стандартного ввода и выводит их
на стандартный вывод. Аналогично работает и grep:

mazdaywik@Mazdaywik-NB10:~/modules$ grep dog < jack.txt
This is the dog, that worried the cat,
That tossed the dog, that worried the cat,
That tossed the dog, that worried the cat,
That tossed the dog, that worried the cat,
That tossed the dog, that worried the cat,
That tossed the dog, that worried the cat,
That tossed the dog, that worried the cat,
mazdaywik@Mazdaywik-NB10:~/modules$

Команда sort (есть и там, и там) сортирует строки, считанные из stdin,
и выводит их в алфавитном порядке на stdout (часть вывода опущена):

Z:>sort < jack.txt
That chased the rat, that ate the malt
...
This is the cat,
This is the cock that crowed in the morn,
This is the cow with the crumpled horn,
This is the dog, that worried the cat,
This is the farmer sowing his corn,
This is the house that Jack built.
This is the maiden all forlorn,
This is the malt
This is the man all tattered and torn,
This is the priest all shaven and shorn,
This is the rat, that ate the malt

Z:>
mazdaywik@Mazdaywik-NB10:~/modules$ sort < jack.txt
That chased the rat, that ate the malt
...
This is the cat,
This is the cock that crowed in the morn,
This is the cow with the crumpled horn,
This is the dog, that worried the cat,
This is the farmer sowing his corn,
This is the house that Jack built.
This is the maiden all forlorn,
This is the malt
This is the man all tattered and torn,
This is the priest all shaven and shorn,
This is the rat, that ate the malt
mazdaywik@Mazdaywik-NB10:~/modules$

Найдём все строчки, содержащие слово This, отсортирует их по алфавиту
и результат сложим в файл с именем this.txt:

Z:>find "This" < jack.txt | sort > this.txt
mazdaywik@Mazdaywik-NB10:~/modules$ grep This < jack.txt | sort > this.txt

В обоих случаях получим файл this.txt со следующим содержимым:

This is the cat,
This is the cock that crowed in the morn,
This is the cow with the crumpled horn,
This is the dog, that worried the cat,
This is the farmer sowing his corn,
This is the house that Jack built.
This is the maiden all forlorn,
This is the malt
This is the man all tattered and torn,
This is the priest all shaven and shorn,
This is the rat, that ate the malt

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

В обоих случаях у программы поиска подстроки (find или grep) стандартный
ввод связывался с исходным файлом, стандартный вывод — со следующей программой
в конвейере — командой сортировки sort. Её стандартный вывод перенаправлялся
в целевой файл.

Для программ, работающих в командной строке, принято соглашение:

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

Таким образом, командам grep, find, sort и другим встроенным командам
можно в командной строке указывать и имена файлов:

grep 'какая-то строчка' one.txt two.txt three.txt
find "какая-то строчка" one.txt two.txt three.txt

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

На Windows наиболее употребительными являются файлы с именами nul и con.
Чтение из файла nul сразу же приводит к обнаружению конца файла (т.е.
этот файл воспринимается как пустой), запись в него игнорируется. Чтение
из файла con соответствует чтению с клавиатуры (даже если стандартный ввод
перенаправлен), запись в него соответствует записи на экран (даже если
перенаправлен станадартный вывод). Файлы nul и con неявно присутствуют
в каждой папке.

На unix-подобных системах чаще всего используется файл /dev/null, аналогичный
файлу nul на Windows: при чтении он воспринимается как пустой (сразу же
встречаем конец файла), при записи записываемые данные игнорируются.

Файлы nul и /dev/null используются в командной строке для того, чтобы
подавить вывод на экран:

C:…>program args... > nul
user@comp:~/...$ program args... > /dev/null

С псевдофайлом con мы работали, когда создавали текстовый файл из командной
строки на Windows:

C:UsersMazdaywikNew folder>copy con "new file.txt"
first line
second line
third line
^Z
Скопировано файлов:         1.

C:UsersMazdaywikNew folder>

Команда cat в unix-системах читает указанные в командной строке файлы
и выводит их содержимое на стандартный вывод. Если файлы не указаны, то она
выводит на стандартный вывод содержимое стандартного ввода. Когда мы создавали
файл в командной строке Linux, мы просто перенаправляли стандартный вывод:

mazdaywik@Mazdaywik-NB10:~/New folder$ cat > "new file.txt"
first line
second line
third line
mazdaywik@Mazdaywik-NB10:~/New folder$

Взаимодействие программ на Python с операционной системой

Для взаимодействия с операционной системой используется модуль os,
подключаемый командной

Чтобы посмотреть перечень всех доступных средств, нужно в среде IDLE
ввести следующую команду:

>>> import sys
>>> help(sys)

Нам все эти средства не нужны, кроме двух основных:

  • доступ к стандартным потокам ввода-вывода,
  • доступ к аргументам командной строки.

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

  • sys.stdin
  • sys.stdout
  • sys.stderr

В этих переменных находятся объекты файлов, связанные со стандартными потоками.
Их можно использовать в файловых операциях точно также, как и объекты файлов,
полученные из функции open().

При запуске программ в среде IDLE конец файла для sys.stdin вводится как
Ctrl-D в новой строчке независимо от операционной системы, вывод на sys.stdout
отображается синим цветом, на sys.stderr — красным цветом.

Пример: используем .readlines() для sys.stdin.

>>> sys.stdin.readlines()
one
two
three
>>> ['onen', 'twon', 'threen']

Пример: выводим на sys.stderr:

>>> print("Напечатается синим")
Напечатается синим
>>> print("Напечатается красным", file=sys.stderr)
Напечатается красным
>>>

Мы говорили о том, что функция print() по умолчанию пишет на экран, чтобы
перенаправить вывод в файл, мы использовали параметр file=. Если быть точным,
функция print() всегда пишет в файл, по умолчанию file=sys.stdout.

Для доступа к аргументам командной строки используется переменная sys.argv,
в которой находится список аргументов. Этот список всегда непустой, т.к.
значением нулевого элемента списка sys.argv[0] является имя самой запущенной
программы. Для примера создадим файл test-argv.py со следующим содержимым:

import sys

for i, arg in enumerate(sys.argv):
    print(i, arg)

Запустим его:

Z:>python test-argv.py one two three
0 test-argv.py
1 one
2 two
3 three

Z:>
mazdaywik@Mazdaywik-NB10:~/modules$ python3 test-argv.py one two three
0 test-argv.py
1 one
2 two
3 three

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

Z:>python test-argv.py "with space" without space
0 test-argv.py
1 with space
2 without
3 space

Пробел между словами with space стал частью параметра, т.к. внутри кавычек,
пробел между словами without и space стал разделителем параметров.

Пример. Напишем программу cat.py, имитирующую работу программы cat
в unix-системах. Программа cat читает файлы, перечисленные в командной
строке, каждый из них открывает и выводит его содержимое на стандартный
вывод. Если имена файлов отсутствуют, то читается стандартный ввод.

import sys


def main():
    if len(sys.argv) == 1:
        process_stream(sys.stdin)
    else:
        for name in sys.argv[1:]:
            with open(name) as stream:
                process_stream(stream)


def process_stream(stream):
    sys.stdout.write(stream.read())


if __name__ == "__main__":
    main()

Программа написана в рекомендуемом стиле для консольных программ.

В программе объявлены две функции main() и process_stream(), в самом конце
вызывается функция main(). Условие __name__ == "__main__" выполняется
всегда при обычном запуске программы.

За счёт того, что основной код программы сосредоточен в функции main(),
а не «размазан» по всему исходнику, понимание программы упрощается, кроме того,
в основном коде мы можем вызывать функции до их объявления.

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

Убедимся, что функция работает, как мы ожидаем:

mazdaywik@Mazdaywik-NB10:~/modules$ python3 cat.py test-argv.py this.txt
import sys

for i, arg in enumerate(sys.argv):
    print(i, arg)
This is the cat,
This is the cock that crowed in the morn,
This is the cow with the crumpled horn,
This is the dog, that worried the cat,
This is the farmer sowing his corn,
This is the house that Jack built.
This is the maiden all forlorn,
This is the malt
This is the man all tattered and torn,
This is the priest all shaven and shorn,
This is the rat, that ate the malt
mazdaywik@Mazdaywik-NB10:~/modules$ cat
hello!
hello!
mazdaywik@Mazdaywik-NB10:~/modules$ python3 cat.py
hello!
hello!
mazdaywik@Mazdaywik-NB10:~/modules$

Мы видим, что поведение встроенной программы cat и написанной нами cat.py
идентично на Linux. Кроме того, программа cat.py будет работать и на Windows:

Z:>python cat.py test-argv.py this.txt
import sys

for i, arg in enumerate(sys.argv):
    print(i, arg)
This is the cat,
This is the cock that crowed in the morn,
This is the cow with the crumpled horn,
This is the dog, that worried the cat,
This is the farmer sowing his corn,
This is the house that Jack built.
This is the maiden all forlorn,
This is the malt
This is the man all tattered and torn,
This is the priest all shaven and shorn,
This is the rat, that ate the malt

Z:>

Пример. Напишем программу grep.py, имитирующую работу встроенной программы
grep unix-подобных систем. Программа принимает в качестве первого параметра
искомую подстроку, после которой может следовать несколько имён файлов. Программа
выводит все строки указанных файлов, содержащие данную подстроку. Если указано
два и более файлов, то в начало выводимой строки добавляется имя сканируемого
файла. Если файлы не указаны, читается стандартный ввод. Программа может
принимать ключ -v, говорящий о том, что вывод нужно инвертировать, т.е.
выводить строки, не содержащие указанной подстроки.

(На самом деле, сходство будет неточное, т.к. программа grep принимает
шаблон, а наша программа — подстроку. Кроме того, ключей у команды grep
на самом деле очень много, а у нас будет только один -v.)

Для простоты будем считать, что ключ -v указывается перед искомой подстрокой.

import sys


def main():
    v = False
    argv = sys.argv[1:]
    if len(argv) > 0 and argv[0] == '-v':
        v = True
        argv = argv[1:]

    if len(argv) == 0:
        print(sys.argv[0]
              + ': Не указана строка поиска',
              file=sys.stderr)
        return

    search_string = argv[0]
    files = argv[1:]

    if len(files) == 0:
        process(search_string, sys.stdin, None, v)
    elif len(files) == 1:
        with open(files[0]) as stream:
            process(search_string, stream, None, v)
    else:
        for name in files:
            with open(name) as stream:
                process(search_string, stream, name, v)


def process(search_string, stream, name, v):
    if name != None:
        prefix = name + ':'
    else:
        prefix = ''

    for line in stream:
        found = (search_string in line)
        if not v:
            if found:
                print(prefix + line, end='')
        else: # -v указан
            if not found:
                print(prefix + line, end='')


if __name__ == "__main__":
    main()

Функция process принимает, помимо потока, который нужно просканировать,
искомую строку, имя файла и факт наличия параметра -v. Переменная prefix
содержит строку, добавляемую в начало вывода каждой строки: она пустая,
если имя файла печатать не надо (сканируется стандартный ввод или файл один),
в ней имя файла и двоеточие в остальных случаях.

Код функции process можно несколько сократить:

def process(search_string, stream, name, v):
    if name != None:
        prefix = name + ':'
    else:
        prefix = ''

    for line in stream:
        found = (search_string in line)
        if found != v:
            print(prefix + line, end='')

Можно убедиться, что написанная программа правильно повторяет поведение
встроенной команды grep:

mazdaywik@Mazdaywik-NB10:~/modules$ grep if cat.py grep.py
cat.py:    if len(sys.argv) == 1:
cat.py:if __name__ == "__main__":
grep.py:    if len(argv) > 0 and argv[0] == '-v':
grep.py:    if len(argv) == 0:
grep.py:    if len(files) == 0:
grep.py:    elif len(files) == 1:
grep.py:    if name != None:
grep.py:        if found != v:
grep.py:if __name__ == "__main__":
mazdaywik@Mazdaywik-NB10:~/modules$ python3 grep.py if cat.py grep.py
cat.py:    if len(sys.argv) == 1:
cat.py:if __name__ == "__main__":
grep.py:    if len(argv) > 0 and argv[0] == '-v':
grep.py:    if len(argv) == 0:
grep.py:    if len(files) == 0:
grep.py:    elif len(files) == 1:
grep.py:    if name != None:
grep.py:        if found != v:
grep.py:if __name__ == "__main__":
mazdaywik@Mazdaywik-NB10:~/modules$ grep for test-argv.py
for i, arg in enumerate(sys.argv):
mazdaywik@Mazdaywik-NB10:~/modules$ grep -v for test-argv.py
import sys

    print(i, arg)
mazdaywik@Mazdaywik-NB10:~/modules$ python3 grep.py for test-argv.py
for i, arg in enumerate(sys.argv):
mazdaywik@Mazdaywik-NB10:~/modules$ python3 grep.py -v for test-argv.py
import sys

    print(i, arg)
mazdaywik@Mazdaywik-NB10:~/modules$

Понравилась статья? Поделить с друзьями:
  • Программа чтобы отключить защитник windows 10
  • Программный raid 1 windows server 2019
  • Программа чтобы закрепить окно поверх всех окон windows
  • Программный raid 1 windows server 2016
  • Программе установки не удалось скопировать файл windows xp