소스 검색

Обновить 'Лекции/HTML/PowerShell.md'

Petrov Timofey 1 주 전
부모
커밋
b4b32a9528
1개의 변경된 파일155개의 추가작업 그리고 1개의 파일을 삭제
  1. 155 1
      Лекции/HTML/PowerShell.md

+ 155 - 1
Лекции/HTML/PowerShell.md

@@ -29,5 +29,159 @@ Windows PowerShell позволяет:
 
 Существует Windows PowerShell в двух ипостасях: помимо эмулятора консоли с командной оболочкой есть интегрированная среда сценариев (Integrated Scripting Environment — ISE). Чтобы получить доступ к интерфейсу командной строки достаточно выбрать соответствующий ярлык в меню Windows или запустить powershell.exe из меню «Выполнить». На экране появится синее окошко, заметно отличающееся по возможностям от допотопного cmd.exe. Там есть автодополнение и другие фишки, привычные пользователям командных оболочек для Unix-систем.
 
+![PowerShell 1.png](PowerShell 1.png)
 
-![](http://)
+Для работы с оболочкой нужно запомнить некоторые сочетания клавиш:
+
+Стрелки вверх и вниз прокручивают историю для повтора ранее набранных команд;
+Стрелка вправо в конце строки перенабирает предыдущую команду посимвольно;
+Ctrl+Home удаляет набранный текст от позиции курсора до начала строки;
+Ctrl+End удаляет текст от курсора до конца строки.
+
+F7 показывает окно с набранными командами и позволяет выбрать одну из них. В консоли также работает выделение текста мышью, копипаст, позиционирование курсора, удаление, backspace — все как мы любим.
+
+![PowerShell 2.png](PowerShell 2.png)
+
+Windows PowerShell ISE является полноценной средой разработки с поддерживающим вкладки и подсветку синтаксиса редактором кода, конструктором команд, встроенным отладчиком и другими программистскими радостями. Если в редакторе среды разработки после имени команды написать знак дефис, вы получите в выпадающем списке все доступные параметры с указанием типа. Запустить PowerShell ISE можно либо через ярлык из системного меню, либо с помощью исполняемого файла powershell_ise.exe.
+
+![PowerShell 3.png](PowerShell 3.png)
+
+Командлеты 
+
+В Windows PowerShell появились т.н. командлеты (cmdlets). Это специализированные классы .NET, в которые заложена разнообразная функциональность. Именуются они по принципу «Действие-Объект» (или «Глагол-Существительное, если вам так больше нравится), а разделенная дефисом связка напоминает сказуемое и подлежащее в предложениях естественных языков. Например, Get-Help буквально означает «Получить-Помощь» или в контексте PowerShell: «Показать-Справку». По сути это аналог команды man в Unix-системах и мануалы в PowerShell нужно запрашивать именно так, а не вызывая командлеты с ключом --help или /?.. Не стоит забывать и об онлайн-документации по PowerShell: у Microsoft она достаточно подробная.
+
+Помимо Get в командлетах для обозначения действий используются и другие глаголы (и не только глаголы, строго говоря). В списке ниже мы приведем несколько примеров:
+
+Add — добавить;
+Clear — очистить;
+Enable — включить;
+Disable — выключить;
+New — создать;
+Remove — удалить;
+Set — задать;
+Start — запустить;
+Stop — остановить;
+Export — экспортировать;
+Import — импортировать.
+
+Есть системные, пользовательские и опциональные командлеты: в результате выполнения все они возвращают объект или массив объектов. К регистру они не чувствительны, т.е. с точки зрения интерпретатора команд нет разницы между Get-Help и get-help. Для разделения используется символ ‘;’, но ставить его обязательно только если в одной строке выполняется несколько командлетов. 
+
+Командлеты Windows PowerShell группируются в модули (NetTCPIP, Hyper-V и т.д.), а для поиска по объекту и действию существует командлет Get-Command. Показать справку по нему можно так:
+
+Get-Help Get-Command
+
+![PowerShell 4.png](PowerShell 4.png)
+
+По умолчанию команда отображает краткую справку, но в командлеты при необходимости передаются параметры (аргументы). С их помощью можно, например, получить детальную (параметр -Detailed) или полную (параметр -Full) справку, а также вывести на экран примеры (параметр -Examples):
+
+Get-Help Get-Command -Examples
+
+Справка в Windows PowerShell обновляется командлетом Update-Help. Если строка команд получается слишком длинной, аргументы командлета можно перенести на следующую, написав служебный символ ‘`’ и нажав Enter — просто закончить писать команду на одной строке и продолжить на другой не получится.
+
+Ниже приведем несколько примеров распространенных командлетов: 
+
+Get-Process — показать запущенные в системе процессы;
+Get-Service — показать службы и их статус;
+Get-Content — вывести содержимое файла.
+
+Для часто используемых командлетов и внешних утилит в Windows PowerShell есть короткие синонимы — алиасы (от англ. Alias). Например, dir — алиас Get-ChildItem. Есть в списке синонимов и аналоги команд из Unix-систем (ls, ps и т.д.), а командлет Get-Help вызывается командой help. Полный список синонимов можно посмотреть с помощью командлета Get-Alias:
+
+![PowerShell 5.png](PowerShell 5.png)
+
+Сценарии, функции, модули и язык PowerShell
+
+Скрипты Windows PowerShell хранятся в виде обычных текстовых файлов с расширением .ps1. Запустить их двойным кликом нельзя: нужно правой кнопкой мыши вызвать контекстное меню и выбрать пункт «Запустить в PowerShell». Из консоли придется либо указать полный путь к скрипту, либо перейти в соответствующий каталог и написать имя файла. Запуск сценариев также ограничен системной политикой, а для проверки текущих настроек можно использовать командлет Get-ExecutionPolicy, который выдаст одно из следующих значений:
+
+Restricted — запуск сценариев запрещен (по умолчанию);
+AllSigned — разрешен только запуск подписанных доверенным разработчиком сценариев;
+RemoteSigned — разрешен запуск подписанных и собственных сценариев;
+Unrestricted — разрешен запуск любых сценариев.
+
+У администратора есть два варианта действий. Наиболее безопасный предполагает подписание скриптов, но это довольно серьезное колдунство — мы будем разбираться с ним в следующих статьях. Сейчас пойдем по пути наименьшего сопротивления и поменяем политику:
+
+Set-ExecutionPolicy RemoteSigned
+
+![PowerShell 6.png](PowerShell 6.png)
+
+PowerShell для этого придется запустить от имени администратора, хотя с помощью специального параметра можно изменить политику и для текущего пользователя.
+
+Пишутся скрипты на объектно-ориентированном языке программирования, команды которого именуются по тому же принципу, что и рассмотренные ранее командлеты: «Действие-Объект» («Глагол-Существительное»). Основное его предназначение — автоматизация задач администрирования, но это полноценный интерпретируемый язык, в котором есть все необходимые конструкции: условный переход, циклы, переменные, массивы, объекты, обработка ошибок и т.д. Для написания сценариев годится любой текстовый редактор, но удобнее всего запустить Windows PowerShell ISE.
+
+В скрипт можно передавать параметры, делать их обязательными, а также задавать значения по умолчанию. Кроме того Windows PowerShell позволяет создать функции и вызывать их точно так же, как и командлеты: для этого используется конструкция Function и фигурные скобки. Сценарий с функциями называется модулем и имеет расширение .psm1. Модули должны храниться в каталогах, определенных в переменных окружения PowerShell. Посмотреть их можно при помощи следующей команды:
+
+Get-ChildItem Env:\PSModulePath | Format-Table -AutoSize
+
+Конвейеры
+
+В последнем примере мы применили знакомую пользователям оболочек для Unix-систем конструкцию. В Windows PowerShell вертикальная черта также позволяет передать выход одной команды на вход другой, но в реализации конвейера есть и существенная разница: речь здесь идет уже не о наборе символов или каком-то тексте. Встроенные командлеты или пользовательские функции возвращают объекты или массивы объектов, а также могут получать их на входе. Как в Bourne shell и его многочисленных последователях, в PowerShell с помощью конвейера упрощается выполнение сложных задач.
+
+Простейший пример конвейера выглядит так:
+
+Get-Service | Sort-Object -property Status
+
+![PowerShell 7.png](PowerShell 7.png)
+
+Сначала выполняется командлет Get-Service, а потом все полученные им службы передаются на сортировку по свойству Status командлету Sort-Object. В какой именно аргумент передается результат работы предыдущего участка конвейера, зависит от его типа — обычно это InputObject. Подробнее этот вопрос будет рассматриваться в посвященной языку программирования PowerShell статье. 
+
+При желании цепочку можно продолжить и передать результат работы Sort-Object еще одному командлету (выполняться они будут слева направо). Кстати, пользователям Windows доступна и привычная всем юниксоидам конструкция для постраничного вывода: 
+
+Get-Service | Sort-Object -property Status | more
+
+Запуск задач в фоновом режиме 
+
+Довольно часто бывает нужно запустить некую команду в фоне, чтобы не дожидаться результата ее выполнения в сессии оболочки. В Windows PowerShell есть несколько командлетов на такой случай:
+
+Start-Job — запуск фоновой задачи;
+Stop-Job — остановка фоновой задачи;
+Get-Job — просмотр списка фоновых задач;
+Receive-Job — просмотр результата выполнения фоновой задачи;
+Remove-Job — удаление фоновой задачи;
+Wait-Job — перевод фоновой задачи обратно в консоль.
+
+Для запуска фоновой задачи мы используем командлет Start-Job и в фигурных скобках указываем команду или набор команд:
+
+Start-Job {Get-Service}
+
+![PowerShell 8.png](PowerShell 8.png)
+
+Фоновыми задачами в Windows PowerShell можно манипулировать, зная их имена. Для начала научимся их отображать:
+
+Get-Job
+
+![PowerShell 9.png](PowerShell 9.png)
+
+Теперь покажем результат работы задания Job1:
+
+Receive-Job Job1 | more
+
+![PowerShell 10.png](PowerShell 10.png)
+
+Всё довольно просто.
+
+Удаленное выполнение команд
+
+Windows PowerShell позволяет выполнять команды и сценарии не только на локальном, но и на удаленном компьютере и даже на целой группе машин. Для этого существует несколько способов:
+
+У многих командлетов есть параметр -ComputerName, но таким способом не получится, например, создать конвейер;
+Командлет Enter-PSSession позволяет создать на удаленной машине интерактивный сеанс; 
+С помощью командлета Invoke-Command можно выполнять команды или сценарии на одном или нескольких удаленных компьютерах.
+
+Версии PowerShell
+
+С момента первого релиза в 2006 году PowerShell серьезно изменился. Инструмент доступен для множества систем, работающих на разных аппаратных платформах (x86, x86-64, Itanium, ARM): Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008/2008 R2, Windows 7, Windows 8, Windows 8.1, Windows RT, Windows RT 8.1, Windows Server 2012/2012 R2, Windows 10, Windows Server 2016, GNU/Linux и OS X. Последний релиз 6.2 выпущен 10 января 2018 года. Написанные для более ранних версий скрипты с высокой вероятностью будут работать в более поздних, а вот с обратным переносом могут возникнуть проблемы, поскольку за годы развития в PowerShell появилось большое количество новых командлетов. Узнать версию установленной на компьютере командной оболочки можно с помощью свойства PSVersion встроенной переменной $PSVersionTable:
+
+$PSVersionTable.PSVersion
+
+![PowerShell 11.png](PowerShell 11.png)
+
+Также можно воспользоваться командлетом:
+
+Get-Variable -Name PSVersionTable –ValueOnly
+
+![PowerShell 12.png](PowerShell 12.png)
+
+То же самое делается и с помощью командлета Get-Host. На самом деле вариантов множество, но для их применения нужно изучить язык программирования PowerShell.
+
+Итоги 
+
+Корпорации Microsoft удалось создать действительно мощную командную оболочку с удобной интегрированной средой для разработки скриптов. От привычных нам по миру Unix средств ее отличает глубокая интеграция с операционными системами семейства Windows, а также с программным обеспечением для них и платформой .NET Core. PowerShell можно назвать объектно ориентированной оболочкой, потому что командлеты и пользовательские функции возвращают объекты или массивы объектов и могут получать их на входе. Думаем, этим инструментом должны владеть все администраторы серверов на Windows: прошло время, когда они могли обойтись без командной строки. Продвинутая консольная оболочка особенно необходима на наших недорогих VPS, работающих под управлением Windows Server Core, но это уже совсем другая история.