Uploaded by Blue_ßtrudel

Методическое пособие WindowsPowerShell для групп 4 курс СА

advertisement
ПРАКТИКУМ ПО СИСТЕМЕ АВТОМАТИЗАЦИИ
WINDOWSPOWERSHELL.
Практикум содержит 10 заданий для индивидуального выполнения
обучающимися в процессе прохождения учебной практики. Каждая работа
оформляется в виде файла в формата Microsoft Word с использование
Screenshot выполненных заданий. Полученные документы направляются
руководителю учебной практики для проверки. Перед выполнением заданий
обучающимся предлагается ознакомиться с теоретической частью курса.
Теоретическая часть.
WindowsPowerShell — расширяемое средство автоматизации от Microsoft,
состоящее из оболочки с интерфейсом командной строки и сопутствующего языка
сценариев.
Версия 1.0 выпущена в 2006 году. WindowsPowerShell 2.0 был выпущен в составе
Windows 7, Windows 8 и WindowsServer 2008 R2 как неотъемлемый компонент системы.
Перед разработчиками стояли следующие основные цели и задачи, которые были
успешно решены:
применение
администрирования;
объект);
командной
строки
в
качестве
основного
интерфейса
реализация модели ObjectFlow (элементом обмена информации является
-
переработка существующих команд, утилит и оболочки;
-
интеграция командной строки, объектов COM, WMI и .NET;
работа с произвольными источниками данных в командной строке по
принципу файловой системы.
Самая важная идея, заложенная в PowerShell, состоит в том, что в командной
строке вывод результатов команды представляет собой не текст (в смысле
последовательности байтов), а объект (данные вместе со свойственными им методами). В
силу этого работать в PowerShell становится проще, чем в традиционных оболочках, так
как не нужно выполнять никаких манипуляций по выделению нужной информации из
символьного потока.
1
PowerShell одновременно является и оболочкой командной строки (пользователь
работает в интерактивном режиме) и средой выполнения сценариев, которые пишутся на
специальном языке PowerShell(.PS1).
Интерактивный сеанс в PowerShell похож на работу в оболочке Unix-систем: все
команды в PowerShell имеют подробную встроенную справку (для большинства команд
приводятся примеры их использования), поддерживается функция автоматического
завершения названий команд и их параметров при вводе с клавиатуры, для многих команд
имеются псевдонимы, аналогичные названиям Unix-утилит (ls, pwd, tee и т.д.).
Язык PowerShell несложен для изучения, писать на нем сценарии, обращающиеся к
внешним объектам, проще, чем на VBScript или JScript. Отдельное внимание было
уделено вопросам безопасности при работе со сценариями (например, запустить сценарий
можно только с указанием полного пути к нему, а по умолчанию запуск сценариев
PowerShell в системе вообще запрещен).
WindowsPowerShell включает множество встроенных команд, имеющих
унифицированный интерфейс. Таких, например, как команды для работы с WMI (GetWmiObject).
Все команды оболочки обрабатываются одним синтаксическим анализатором, в то
время как во многих других оболочках каждому средству соответствует отдельный
анализатор. Это значительно облегчает изучение команд.
PowerShell позволяет запускать унаследованные VBS-сценарии.
1.1. Основные понятия PowerShell
В PowerShell существует несколько важных понятий. Одно из них это командлет
(Cmdlet)– команда WindowsPowerShell, предназначенная для работы с объектами и
выполняющая определенные функции.
Командлеты можно идентифицировать по их именам, которые составлены из
глагола и существительного, разделенных дефисом (-), например Get-Help, Get-Process и
Start-Service. Большинство командлетов WindowsPowerShell очень просты, и
предполагается, что они будут использоваться вместе с другими командлетами.
Например, командлеты категории «get» только возвращают данные, командлеты «set»
только задают или изменяют значения элементов данных, командлеты «format» только
форматируют данные, а командлеты «out» только направляют вывод в указанное место
назначения.
Хотя взаимодействие с оболочкой WindowsPowerShell осуществляется при помощи
ввода команд в виде текста, оболочка WindowsPowerShell основана не на тексте, а на
объектах. Выходным элементом любой команды является объект. Объект, полученный на
выходе одной команды, можно послать на вход другой команды. В результате оболочка
WindowsPowerShell позволяет, с одной стороны, администраторам работать с хорошо
знакомым интерфейсом командной строки, с другой, использовать мощный функционал
работы с объектами. WindowsPowerShell расширяет концепцию пересылки данных между
командами, позволяя пересылать объекты, а не просто текст, что является порой очень
полезным.
2
В следующей таблице содержится выборка командлетов (Cmdlet), поставляющихся
с PowerShell, с приведением максимально похожих команд из других широко известных
оболочек командной строки.
Описание
pwd
Отображает текущий
рабочий каталог
Меняет текущий
каталог
Очищает экран
Windows
PowerShell(
Alias)
Get-Location
gl, pwd
Set-Location
sl,
cd, cd, chdir
chdir
cls,
cls
clear
cpi,
copy
copy, cp
cd
help, man
ri, del,
erase,
rmdir,
rd, rm
rni, ren
man
rm,
rmdir
Clear-Host
Copy-Item
Get-Help
Remove-Item
Rename-Item
cmd.exe /
COMMAND.
COM(MSDOS,
Windows)
cd
Bash(Unix,
BSD,
Linux)
Windows
PowerShell(Cmdlet)
help
del,
erase,
rmdir, rd
clear
cp
ren,
rename
mi, move, move
mv
mv
Get-ChildItem
gci, dir, dir
ls
ls
Write-Output
echo,
write
echo
echo
Pop-Location
popd
popd
popd
Move-Item
mv
Копирует один или
несколько файлов или
дерево директорий (в
PowerShell также
можно копировать
объекты других
поставщиков данных)
Справкапокомандам
Удаляет файл/каталог
(или другой элемент в
поставщиках данных
PowerShell).
Переименовывает
файл/каталог
Перемещает
файл/каталог в новое
местоположение
Выводит все
файлы/каталоги в
текущем каталоге
Выводит строки,
переменные на
стандартный вывод
Изменяет текущий
каталог на тот,
который был
3
Push-Location
pushd
pushd
pushd
Set-Variable
sv, set
set
set
Get-Content
gc, type, type
cat
find,
findstr
cat
Get-Process
gps, ps
tlist,task
list
ps
Stop-Process
spps,
kill
tee
kill,taskk
ill
n/a
kill
Select-String
Tee-Object
grep
tee
последним помещѐн в
стек
Помещает текущий
каталог в стек
Установка значения
переменной/создание
переменной
Получаетсодержимое
файла
Выводит строки,
подходящие под
условие
Выводит все
запущенные
процессы
Останавливаетзапуще
нныйпроцесс
Передаѐт входные
данные в файл или
переменную, затем
передаѐт их дальше
по конвейеру
Теоретические принципы Windows PowerShell Windows PowerShell
Предыдущие попытки Microsoft по созданию оболочек командной строки были не
слишком успешны. Старый command.com, вероятно, соответствовал уровню первых
версий MS DOS, но растущее число функций операционной системы вскоре превысило
его возможности. Оболочка cmd.exe, появившаяся в Windows NT, предоставляла
пользователям дополнительные средства. Но по сравнению с популярными оболочками
Unix, такими как Bash, командная строка Microsoft, несомненно, имела множество
недостатков. Теперь Microsoft полностью изменила ситуацию. Создавая Windows
PowerShell (ранее называлась Monad Shell, MSH), разработчики средств
администрирования хотели дать нам оболочку для Windows, которую можно будет
использовать для написания любых сценариев для управления системой. Windows
PowerShell следует совершенно новой концепции, в отличии от тексто-ориентированных
оболочек, таких как bash. Цели разработки Windows PowerShell Windows PowerShell – это
новая оболочка командной строки Windows, разработанная специально для системных
администраторов. Эта оболочка содержит интерактивную командную строку и среду
сценариев, которые можно использовать как по одиночке, так и вместе. В
противоположность большинству оболочек командной строки, которые принимают и
возвращают текст, Windows PowerShell базируется на объектной модели, появившейся в
.NET Framework 2.0. Это фундаментальное отличие в среде позволяет использовать для
4
управления и настройки Windows совершенно новые инструменты и методики. Windows
PowerShell вводит идею командлетов (пишется «cmdlet»). Командлет – это простой
инструмент командной строки, интегрированный в оболочку и выполняющий
единственную функцию. Хотя вы можете использовать командлеты поодиночке, их мощь
становится более очевидной при использовании комбинаций командлетов для выполнения
сложных задач. Windows PowerShell содержит несколько сотен базовых командлетов, а
также дает возможность создавать собственные командлеты и сценарии и передавать их
другим пользователям. Как многие другие командные оболочки, Windows PowerShell дает
вам доступ к файловой системе компьютера. Благодаря поставщикам Windows PowerShell
вы получаете легкий доступ к другим хранилищам данных, таким как реестр и хранилища
сертификатов. О тексте, разборе текста и объектах PowerShell полностью объектноориентирована. По сравнению с обычными оболочками она работает иначе, результатом
выполнения команды будет не текст, а объект (дальше этот момент будет рассмотрен
подробнее). Но аналогично более ранним популярным оболочкам, она имеет конвейер, в
который передаются и в котором обрабатываются результаты отдельных команд.
Единственная разница состоит в том, что исходные и промежуточные значения и
результаты являются объектами, а не текстом. Объекты PowerShell не отличаются от
объектов в программах C++ или C#. Вы можете представить объект как блок данных с
атрибутами и методами. Методы представляют собой действия, которые можно
совершить с объектом. Если, например, вы обращаетесь к службе из Windows PowerShell,
вы на самом деле используете объект, соответствующий этой службе. Если вы выводите
на экран информацию о службе, вы выводите атрибуты соответствующего объекта
службы. И если вы запускаете службу, то есть меняете атрибут статуса службы на
«запущен», вы используете метод объекта службы. По мере увеличения опыта вы лучше
поймете преимущества обработки объектов и будете работать с объектами осознанно.
Объектно-ориентированная концепция PowerShell делает стандартный разбор текста
командных оболочек Unix (анализ/оценка) и текстовую информацию со всеми ее
проблемами и склонностью к ошибкам, полностью излишними. Чтобы пояснить это,
рассмотрим следующий пример: Предположим, вы хотите получить список всех
процессов, которые расходуют более 100 дескрипторов. В традиционной командной
оболочке Linux мы должны вызвать команду для просмотра процессов (ps -A). Эта
команда возвращает текстовый список. Каждая строка будет содержать сведения о
процессе, разделенные пробелами. Вы должны разобрать эти строки с помощью
отдельного инструмента, отфильтровать коды ID процессов, после чего с помощью другой
программы запросить число используемых процессом дескрипторов. Затем вы должны
разобрать полученный в виде текста результат, отфильтровать нужные строки и вывести
на экран соответствующий текст. В зависимости от того, насколько хорошо вы обрезаете
и фильтруете информацию из текста, выдаваемого функциями, этот подход заслуживает
доверия в большей или меньшей степени. Однако, например, если заголовок столбца в
выходных данных изменился, и имена процессов стали слишком длинными, у вас
несомненно возникнут проблемы. PowerShell использует принципиально другой подход.
Вы также начинаете с команды get-process, которая возвращает все запущенные процессы
5
в операционной системе. Только в этом случае вы получаете список объектов, состоящий
из объектов процессов. Эти объекты можно исследовать на предмет их атрибутов и
запросить значения прямо у них – таким образом, вам не нужно исследовать текстовые
строки и разделять их на столбцы. Мы еще поговорим об этом более подробно. Новый
язык сценариев В Windows PowerShell не используется какой-либо существующий язык,
для нее был создан собственный. Причины этого таковы: • . Windows PowerShell
необходим язык для управления объектами .NET. • . Язык должен поддерживать сложные
задачи, не делая простые задачи сложными. • . Язык должен соответствовать соглашениям
других языков, используемых для программирования в .NET, таким как C#. В настоящее
время каждый язык имеет свои собственные команды. В Windows PowerShell мы
обеспечили соответствие всех команд определенной логике с точки зрения конструкций и
наименования. Командлет представляет собой специализированную команду, которая
работает с объектами в Windows PowerShell. Вы можете узнать командлеты по их именам:
глагол и существительное, всегда в единственном числе, разделенные значком тире (-),
например, get-help, get-process и start-service. В Windows PowerShell большинство
командлетов очень просты и созданы для использования совместно с другими
командлетами. Так, например, командлеты «Get» только извлекают данные, командлеты
«Set» создают или изменяют данные, командлеты «Format» форматируют данные, а
командлеты «Out» пересылают выводимые данные в указанное место. Команды Windows
и служебные программы Вы привыкли использовать определенные команды. Новый язык,
который не принимает во внимание этот факт, обречен на быстрое забвение. Поэтому в
Windows PowerShell вы можете использовать стандартные команды Windows и запускать
программы Windows, имеющие графический интерфейс, например Блокнот (Notepad) и
Калькулятор (Calculator). Кроме того, как и в Cmd.exe, вы можете получать текстовый
вывод из других программ и использовать этот текст в командной оболочке. Даже если
команды, такие как dir, ls или cd, не следуют официальному синтаксису Windows
PowerShell, они будут работать и могут использоваться без каких-либо проблем.
Интерактивная среда Как и в других командных оболочках, в Windows PowerShell
поддерживается полностью интерактивная среда. Если вы в ответ на приглашение вводите
команду, она выполняется и результат выводится в окно командной оболочки. Вы можете
пересылать результат работы команды в файл или на принтер, а также использовать
оператор конвейера (|) для передачи его другой команде. Поддержка сценариев Если вы
уже повторяли одни и те же команды, мы рекомендуем не вводить команды или
последовательность команд по отдельности, а сохранить их в файле и выполнять этот
файл. Файл, содержащий команды, называется сценарием. Аналогично поддержке
интерактивных интерфейсов, Windows PowerShell обеспечивает полную поддержку
сценариев. Вы можете запустить сценарий, введя его имя в строке приглашения.
Расширение файлов сценариев Windows PowerShell scripts - .ps1; вводить расширение
файла необязательно. Хотя сценарии используются очень часто, они также могут быть
использованы для распространения вредоносного кода. Поэтому вы можете определить в
Windows PowerShell политики безопасности (также называемые политиками выполнения),
чтобы указать, какие сценарии могут запускаться, и должны ли они иметь цифровую
6
подпись. Чтобы избежать ненужного риска, ни в каких политиках выполнения Windows
PowerShell не разрешается выполнять сценарии двойным щелчком на их значках, что
можно делать, например, со старыми файлами .bat, .cmd или.vbs. CMD, WScript или
PowerShell? Что выбрать? Для Windows XP имеется три оболочки языков сценариев:
старая добрая оболочка CMD, Windows Scripting Host для ваших сценариев VB или Jscript,
а теперь и Windows PowerShell. Но не бойтесь, вам не нужно выбирать между оболочками
или беспокоиться о том, что одна из них устареет. Даже в новых версиях Windows, таких
как Vista или Longhorn Server, вы обнаружите, что все три оболочки остались
равноправными. Вы можете использовать ту из них, которую предпочитаете, на ваш вкус.
Вы также можете использовать оболочку, которая наилучшим образом подходит для
конкретной задачи. Если вы до сих пор написали немного сценариев, сейчас самое время
начать работать с Windows PowerShell, чтобы иметь под рукой новейшую и самую
простую в использовании технологию. Решая практические задачи, которые у вас есть или
будут, вы увидите, как это просто и какими мощными могут быть простые сценарии, не
перерывая гигантские тома и книги из 60-х и 70-х годов о программировании командных
файлов. Windows PowerShell 1.0 Хотя Windows PowerShell имеет версию 1.0, качество
продукта весьма впечатляет, и я могу с чистой совестью рекомендовать его использование
в практической работе. В основном это вызвано тем, что Windows PowerShell на самом
деле является действительно новым способом использования популярной среды .NET
Framework 2.0. Однако вам следует учитывать небольшой номер версии продукта. Уже
набор функций должен сказать вам, что не все, необходимое вам, уже имеется в Windows
PowerShell. Windows PowerShell сейчас может обеспечить прямой доступ к файловым
системам, журналам сообщений, записям реестра, интерфейсам и объектам .NET, WMI и
ADSI; однако удаленная работа в нем еще не реализована. Это означает, что доступ к
другим компьютерам работает с помощью средств WMI или .NET. В будущем мы
сможем, вероятно, использовать для администрирования новые интерфейсы веб-служб,
которые были сертифицированы в 2006 году. Сейчас следует удовлетвориться
использованием существующих проверенных методов, таких как WMI и .NET.
Со службой Windows Scripting Host (WSH), введенной в Windows 2000, Microsoft
заявила о создании новой мощной системы сценариев. Эта система была настолько
мощной, что была использована вирусописателями в качестве новой арены. Неопытные
пользователи получали несколько первых электронных писем с многообещающими
привлекательными картинками, но когда они открывали вложение, там было не на что
смотреть, они оборачивались сценариями VBScript, которые приступали к взлому
системы. Windows PowerShell делает все возможное, чтобы противостоять этому типу
угроз. Так, базовые настройки Windows PowerShell предполагают запрет запуска любых
сценариев. Эта функция должна быть явным образом активирована системным
администратором. Активация обеспечивает различные уровни безопасности, которые
используют подписание сценариев. Кроме того, расширение файлов Windows PowerShell
(PS1) ассоциировано с блокнотом (Notepad). Даже если ваша среда допускает выполнение
сценариев, все неблагоразумные двойные щелчки по почтовым вложениям или файлам
будут просто приводить к запуску Блокнота и демонстрации исходного кода. И наконец,
7
Windows PowerShell всегда требует явного ввода полного пути для файлов, которые
которые не находятся в папках обозначенных в переменной окружения %Path%. Это
может предотвратить случайное выполнение программы, которую вы не хотели
использовать, в Windows PowerShell. Чтобы быть в состоянии запустить сценарий, вам
следует изменить настройки безопасности для Windows PowerShell. Для этой цели
используются два командлета: getexecutionpolicy и set-executionpolicy. С помощью getexecutionpolicy вы получаете существующие настройки. Существует четыре уровня
безопасности:
Значение политики Описание
Restricted (Запрещено, по умолчанию) Сценарии не запускаются
Allsigned (Все подписанные) Запускаются только подписанные сценарии
Для изменения этих настроек системный администратор должен вызвать, например,
команду set-executionpolicy remotesigned Microsoft предоставляют шаблон групповой
политики, чтобы автоматически устанавливать ключ в больших организациях.
8
Практикум. Задания.
1.1. Задание №1. Запуск среды WindowsPowerShell
Запуск среды WindowsPowerShell осуществляется следующим образом Пуск ->Все
Программы и выбрать элемент WindowsPowerShell. Другой вариант запуска оболочки –
пункт Выполнить в меню Пуск, ввести имя файла PowerShellи нажать кнопку ОК.
1. Выполним первую команду в PowerShell. Для первого знакомства с
WindowsPowerShell вполне подойдет команда help. Внимательно изучите
выведенную на экран информацию.
Исполните из командной строки:
HelpGet-Command
В результате выполнения этой команды мы получим полное описание команды
Get-Command, включая ее назначение, синтаксис, опции и т.п.
2. Выполните команду:
Get-Command
На экран будет выведен список всех встроенных команд.
3. Просмотрите список всех сервисов, запущенных на вашем компьютере, исполнив
команду:
Get-Service
Команда Get-Service служит для получения списка всех сервисов, запущенных на
данном компьютере.
4. Просмотрите список всех процессов, запущенных в настоящий момент на
вашемкомпьютере,исполнив команду:
Get-Process
5. Для получения информации только об одном процессе в качестве аргумента
команды Get-Process задается имя этого процесса. Выполните команду:
Get-Processexplorer
Из командной строки исполните команду:
Get-Process w*
На экран должна быть выведена информация обо всех запущенных процессах,
начинающихся на символ w.
6. По умолчанию информация выводится в виде таблицы, но на самом деле все
команды возвращают объекты. Эти объекты могут быть переданы на вход другим
командам с помощью символа «|».
Исполнитекоманду:
Get-Process i* | format-list
9
Объекты будут отформатированы в виде списка. Теперь список процессов доступен
в другом представлении. Для получения подробной информации о различных форматах
можно использовать следующую команду:
Helpformat*
Другие возможные форматы:
Get-Process i* | format-wide
и
Get-Process i* | format-custom
7. Выполняя команды, мы всегда получаем объекты, а у объектов есть свойства.
Просмотрите все свойства объекта, полученного при выполнении команды GetProcess используя следующую команду:
Get-Process | Get-Member
8. Поскольку на выходе всегда получается объект, можно манипулировать им для
выполнения дополнительных операций. Выполните операцию фильтрации,
исполнив команду:
Get-Process | where {$_.handlecount -gt 400}
Выполните операцию сортировки, исполнив команду:
Get-Process | where {$_.handlecount -gt 400} | sort-object
Handles
9. Произведем сортировку объектов по свойству WS (workingset) и выбор 5
процессов, занимающих больше всего памяти
Get-Process | sort-object -property WS –descending| select-object first 5
10. Команда stop-process позволяет остановить запущенный процесс.
Запустите Notepad. Выполните команду:
Get-process notepad | stop-process
Окно Блокнота закроется. Снова запустите Notepad.
Такая возможность не всегда является безопасной, поэтому лучше использовать
подобные команды с опцией whatif, которая показывает, что произойдет при выполнении
той или иной команды, но на самом деле команда не выполняется:
Get-Process notepad | stop-process -whatif
Кроме того, можно указывать на необходимость подтверждения перед
выполнением команды:
Get-Process notepad | stop-process -confirm
В последнем примере мы получаем описание действий, которые выполняет
команда, и можем выбрать, подтверждать ее выполнение или нет.
10
1.2. Задание №2. Работа с файловой системой
Разберем основные команды WindowsPowerShell, применяемые для манипуляций
с файловой системой: new-item, copy-item, move-item, rename-item и
remove-item.
11. Создадим новый подкаталог TextFiles в текущем каталоге:
new-itemTextFiles -itemtype directory
Еслиопуститьпараметр-itemtype,тоWindowsPowerShell спросит, что мы создаем
— файл (file) или каталог (directory). Отметим,чтоукомандыnew-itemестьалиас—ni.В
сокращенном виде наша первая команда будет выглядеть так:
niTextFiles -itemtype directory
12. Создайте несколько новых файлов в текущем каталоге: psdemo.txt, 1.txt, 2.txt:
13. Скопируем все файлы с расширением *.txt в подкаталог TextFiles, используя
команду copy-item (алиасы — cpi, cp, сору):
Если применять данную команду в пакетном файле, имеет смысл сделать ее более
понятной, указав параметры -path (источник) и -destination (приемник):
copy-item -path '.\*.txt' -destination '.\TextFiles'
14. После выполнения команды копирования мы используем команду set-location для
перехода в подкаталог TextFiles.
set-locationTextFiles
15. С помощью команды rename-item переименовываем файл psdemo.txt в
psdemo.bak. При необходимости можно применять опции -path и -newName:
rename-item psdemo.txt psdemo.bak
16. После того как файл переименован, переносим его на один уровень вверх,
используя команду move-item:
move-itempsdemo.bak ..\
17. Затем применяем команду set-location, а точнее — ее алиасslдля перехода в
другой каталог:
sl ..
18. Манипуляции с файловой системой мы завершаем удалением всего каталога
TextFiles, используя команду remove-item. Поскольку в каталоге TextFiles
содержатся файлы, применяется опция -recurse. Если эта опция не указана,
WindowsPowerShell запросит подтверждение перед выполнением команды
remove-item.
remove-itemTextFiles–recurse
11
12
13
14
15
Powershell скрипты
Все команды в Powershell как правило используются в форме командлетов. Все
командлеты
это
специализированные
классы .NET
Framework и .NET
Core (используется в PowerShell Core 6 и выше).
Задание №3
Запуск Powershell
WIN+R:
Командлеты — это название команд в Powershell. Каждый командлет реализует
заложенную в него функциональность. Как правило наименование командлета состоит из
пары: глагол-существительное. Например: Get-Help — получить помощь.
Обычно Get используется чтобы получить информация, Set — внести изменение, New —
создать новый объект, политику и т.п. и Remove -удалить объект, политику и т.п.
Командлеты не чувствительны к регистру. Написать Get или get не важно, powershell
воспримет эти команды одинаково.
Чтобы получить список всех доступных командлетов необходимо использовать GetCommand
Get-Command
1
16
Для получения справки по любому командлету напишите Get-Help имя-комндлета
Get-Help Get-Command
Вывод списока командлетов для управления процессами:
Get-Command *Process*
17
Вывод списка процессов с именем WhatsApp
Get-Process -Name WhatsApp –IncludeUserName
Задание №4. Алиасы
Алиасы в Powershell это по сути более короткие названия командлетов. Т.е.
любому командлету можно присвоить свое короткое имя (alias). Например алиасом для
командлета Get-Process является gps. Согласитесь куда проще и быстрее
написать gps чем Get-Process.
Список всех alias можно получить используя командлет Get-Alias
PS C:\WINDOWS\system32> get-alias
Конвейер
Конвейер используется для передачи выходных данных командлета идущего вначале во
входные данные командлета следующего за ним.
18
Для получения более сокращенной формы отчета служит командлет Select-Object. Давайте
используем его в конвейере.
Get-Process|Select-Object ID,CPU,ProcessName
1
19
Теперь можно передать эти данные дальше. Например выгрузить в текстовый файл
Get-Process|Select-Object ID,CPU,ProcessName|Out-File C:\TMP\out.t
Структура объектов
В Powershell объекты играют самую важную роль. От типа объекта зависит что именно с
ним можно сделать. Узнать тип объекта и вывести список всех его элементов позволяет
команда Get-Member
Get-Process|Get-member
20
Скрипты Powershell
Скрипты сохраняются в файлах с расширением ps1
Скрипт будет запускать блокнот, далее выполняется проверка если блокнот запущен
выводится сообщение об этом и после блокнот закрывается. Если блокнот не запущен то
выводится соответствующее сообщение об этом. На самом деле блокнот будет всегда
запущен, т.к. мы вначале скрипта написали Start-Process notepad
Start-Process notepad
$a=Get-Process notepad
if ($a.ProcessName -like "Notepad")
{
Write-Host "Блокнот запущен, давайте его закроем"
Stop-Process -name notepad
}
else
{
Write-Host "Блокнот не запущен, что поделать"
}
21




Для включения возможности запуска скриптов Powershell необходимо запустить
Powershell от Администратора и ввести командлет Set-ExecutionPolicy с одним из
параметров:
Restricted — политика по умолчанию. Выполнение всех скриптов запрещено
RemoteSigned — разрешено запускать собственные скрипты и подписанные
доверенным разработчиком
AllSigned — разрешено запускать скрипты, подписанные доверенным
разработчиком. Каждый раз перед запуском такого скрипта PowerShell будет запрашивать
подтверждение
Unrestricted — в системе разрешается запускать любые скрипты
Если вы полностью уверены в запускаемых скриптах можете поставить Unrestricted.
Давайте так и сделаем
Set-ExecutionPolicy -Unrestricted
Будет предупреждение по безопасности, соглашаемся нажав Y
Можем посмотреть текущую настройку политики безопасности при помощи
командлета Get-ExecutionPolicy
Get-ExecutionPolicy
22
Здание №5. Переменные Powershell
Переменные Powershell объявляются при помощи знака $ и могут быть созданы в
любом месте скрипта. При создании переменной нет необходимости указывать ее тип,
система попытается определить его сама. В имени переменной допустимы любые буквы,
цифры и знак подчеркивания.
Создание переменных
Давайте создадим несколько новых переменных и проверим что все получилось
$a="Переменная1"
$b="12345"
$c=Переменная 3
$d=12345
Мы видим что успешно созданы 3 переменные: $a, $b, $d . Переменная $c не создалась и
вылезла ошибка. Дело в том что в переменной $c при объявлении мы добавили пробел но
не поставили кавычки. Если необходимо занести в переменную текст с пробелом нужно
обязательно использовать кавычки. Посмотрим тип созданных переменных.
$a.GetType().Fullname
$b.GetType().Fullname
$c.GetType().Fullname
$d.GetType().Fullname
23
Переменная $a и $b имеют тип строка (System.String). Если с $a все понятно, там
использовались буквы и цифра, то $b стала строкой только потому что мы занесли цифры
в кавычки. А в переменной $d мы использовали цифры без кавычек, поэтому тип
переменной стал число (System.Int32). Переменная $c выпала с ошибкой NULL потому
как еѐ не существует.
Важно помнить, если вы случайно попытаетесь присвоить значение переменной которая
уже существует, старое значение в ней изменится на новое. Поэтому необходимо быть
осторожным в именовании переменных, и перед созданием новой, просто введите в
Powershell еѐ название и нажмите Enter. Если переменная не существует то система
ничего не выведет кроме пустой строки.
Сделать из переменной $d строку:
$d=[string]$d
Типы данных Powershell
Рассмотрим типы данных бывают в Powershell
Тип
Класс .NET
[string]
System.String
[char]
System.Char
[bool]
System.Boolean
[int]
[long]
[decimal]
System.Int32
System.Int64
System.Decimal
[single]
System.Single
[double]
System.Double
Описание
Строка
Символ (как элемент кода UTF-16)
Булево (принимает
значение $true или $false)
32-разрядное целое число
64-разрядное целое число
128 битное десятичное число. В конце числа
буква d обязательна
Число одиночной точности с плавающей
запятой
Число двойной точности с плавающей
запятой
24
[DateTime]
System.DateTime
[array]
System.Object[]
[hashtable]
System.Collections.Hashtable
Представляет текущее время выраженное
датой и временем суток.
Массив. Предоставляет методы для
создания, изменения, поиска и сортировки
массивов
Хеш-таблицы. Представляет коллекцию пар
«ключ-значение», которые упорядочены по
хэш-коду ключа. Отличие от массивов это
использование именованных ключей вместо
индексов.
Давайте присвоим переменной $e булево значение
$e=$True
Теперь $e имеет тип System.Boolean, добавим кавычки и посмотрим что будет
$e="$True"
Переменная стала System.String. Сделаем из нее снова булево, но кавычки убирать не
будем
$e=[bool]$e
С датой также можно работать сделав преобразование из строки. Давайте создадим
переменную $data и добавим текст «01/01/2001» это будет в формате строки
$data="01/01/2001"
И теперь можно преобразовать эту строку в формат даты и посмотреть на вывод
[datetime]$data
25
Задание №6. Массивы
Массив имеет тип System.Object[] и каждый элемент в массиве может иметь свой
тип. Создадим переменную $massiv и добавим в неё 3 значения: два строковых и одно
число. Затем определим тип каждого элемента обратившись к нему по очереди.
Обратиться к элементу массива можно указав его порядковый номер в скобках []. Расчет
начинается с 0
$massiv="element1",2,"tri"
26
Рассмотрим последний тип данных это hashtable. Хеш-таблицы отличаются от
массива тем что вместо индекса используют пару «ключ-значение». Объявляется в таком
формате:
@{kluch1=»Nomer1″;kluch2=»Nomer2″;kluch3=»Nomer3″}. Давайте создадим переменную
$hash и занесем в нее хеш-таблицу
$hash=@{kluch1="Nomer1";kluch2="Nomer2";kluch3="Nomer3"}
Тут как в массиве, каждый элемент может иметь свой тип. Можно применять
всевозможные сортировки, выборки и исключения.
Область действия
Необходимо помнить, все созданные пользователем переменные хранятся только в
текущем сеансе Powershell. После закрытия окна консоли и повторного открытия
переменных уже не будет.
Существует две области действия переменных: глобальная и локальная. Глобальная
область действия используется на весь сеанс Powershell. Она состоит из переменных
Powershell, системных переменных и переменных определенных в консоли (в рамках
текущего сеанса Powershell). Локальные переменные работаю только в той области для
которой они определены (функция или скрипт) не выходя за ее пределы.
Рассмотрим работу глобальной и локальной переменной
function func_test {
$test_local="LOCAL"
$test_local
$Global:test_global="GLOBAL"
$test_global
}
Создали функцию в которой прописали две переменные $test_local — локальная
переменная, действует только внутри этой функции. Переменная $test_global —
27
глобальная, данные в ней сохраняются даже после завершения работы функции, в отличие
от локальной.
Задание №7. Работа с переменными
Для работы с переменными существует 5 командлетов.
Get-Command *Variable*
Название
Get-Variable
Назначение
Получить значение
переменой
NewVariable
Создать новую
переменную
Set-Variable
Изменить
переменную
ClearVariable
Очистить
переменную
RemoveVariable
Удалить
переменную
Описание
Позволяет получить значение переменной со всеми
дополнительными параметрами. Если не указать
название переменной, командлет выведет список всех
текущих переменных Powershell.
Создает новую переменную с возможностью задать
дополнительные параметры. Можно создать
переменную только для чтения, скрытую переменную
или переменную с пробелом в имени
Изменение значений в переменной. В случае
отсутствия переменной с указанным именем, она
будет создана.
Удаляет все значения в переменной, но не саму
переменную. Тип переменой остается тот же что был
до очистки значений.
Удаляет переменную со всеми ее значениями
Работа с переменными
Запустим командлет Get-Variable
Get-Variable
28
Мы видим список всех переменных Powershell, большая часть из них это системные
переменные.
Get-Variable hash
Видим что тут большее число параметров чем можно указать при заведение через знак $.
Попробуем создать новую переменную только для чтения. После ее создания значение
переменной нельзя будет изменить.
29
New-Variable -Name rd -Option ReadOnly -Value 100 -Description "Только
для чтения"
Get-Variable -Name rd|Format-List
Попробуем изменить в ней значение
Set-Variable -Name rd -Value 200
Появилась ошибка, потому что переменная только для чтения. Данный параметр бывает
полезен в скриптах. Его используют для постоянной переменной которую нельзя менять.
Удалим переменную
Remove-Variable -Name rd –Force
Параметр -Force указывать обязательно, иначе переменную только для чтения не удалить.
Удобство использования переменных заключается в том, что мы можем использовать ее
для сокращения записи. Получим список процессов firefox с параметрами используемой
памяти
$fire=(Get-Process -Name firefox)|select Name, PagedMemorySize64
30
Переменные окружения
Переменные окружения Windows также доступны из Powershell. Доступ к ним
можно получить через диск ENV:
dir ENV:
31
Задание №8. Операторы сравнения Powershell
В Powershell используются операторы сравнения на основе букв. Очень хочется
написать знак > вместо -gt или знак = вместо -eq. Перед оператором сравнения или
логическим оператором обязательно нужно ставить знак —
Операторы сравнения
Оператор Значение
Описание
-eq
Equal
Равно
-ne
Not equal
Не равно
-gt
Greater than
Больше
-ge
Greater than or equal
Больше или равно
-lt
Less than
Меньше
-le
Less than or equal
Меньше или равно
-like
Wildcard comparison
Используется подстановка символов для
поиска по шаблону
-notlike
Wildcard comparison
Используется подстановка символов для
поиска не соответствия указанному
шаблону
-match
Regular expression comparison Использование регулярных выражений
для поиска по шаблону
-notmatch Regular expression comparison Использование регулярных выражений
для поиска не соответствия указанному
шаблону
-contains
Containment operator
Определяет, содержит ли значение слева
от оператора значение справа
-notcontains Containment operator
Определяет, что значение слева от
оператора не содержит значение
оператора справа
-in
Containment operator
Возвращает true если искомое значение
содержится в коллекции
-notin
Containment operator
Возвращает true если искомое значение
не содержится в коллекции
-replace
Replace operator
Заменяет часть или все значение слева от
оператора
-is
Type
Возвращает true если оба объекта
одинаковы
-isnot
Type
Возвращает true если оба объекта разные
По умолчанию все операторы сравнения нечувствительны к регистру. Чтобы сделать
оператор сравнения чувствительным к регистру, перед именем оператора поставьте
букву c. К примеру, чувствительной к регистру оператор -eq пишется как -ceq. Чтобы
32
сделать нечувствительность к регистру явной, перед оператором ставится i. К примеру,
явно нечувствительная к регистру версия оператора -eq это -ieq.
Когда входные данные для оператора являются скалярным значением (число), операторы
сравнения возвращают логическое значение. Если входные данные представляют собой
набор значений, операторы сравнения возвращают любые совпадающие значения. Если в
коллекции нет совпадений, операторы сравнения возвращают пустой массив. Исключение
составляют операторы contains, notcontains, in, notin, is, isnot которые всегда
возвращают логическое значение.
1, 2, 4, 8 -eq 2
1, 2, 4, 8 -eq 3
В первом варианте при сравнении набора чисел с 2 такое число есть в массиве. Во втором
варианте при сравнении с 3 возвращается пустой массив, такого числа нет.
Проверка:
20 -eq 20
21 -eq 20
"Проверка" -eq "Проверка"
"Проверка" -eq "Проверка не прошла"
"Test_ne" -ne "Test"
Сравним между собой две даты.
33
Поиск файлов больше определенного размера:
Get-ChildItem -Path c:\ -Recurse|Where-Object {$_.Length -ge 40000000}
Удобный инструмент в качестве автоматизации чистки логов.
Операторы сдерживания
Операторы сдерживания (-contains и -notcontains) аналогичны операторам
равенства. Только операторы сдерживания всегда возвращают логическое значение, даже
если входными данными является коллекция.
В отличие от операторов равенства, операторы сдерживания возвращают значение, как
только они обнаруживают первое совпадение. Операторы равенства оценивают все
входные данные, а затем возвращают все совпадения в коллекции.
"Вася","Петя","Маша" -contains "маш"
"Вася","Петя","Маша" -contains "маша"
34
Оператор замены
Оператор замены (-replace) заменяет все или часть значения указанным значением
с помощью регулярных выражений. Оператор -replace можно использовать для многих
административных задач, таких как переименование файлов, замена текста в файле и
прочее.
Массовое переименованию файлов *.log в *.bak
Get-ChildItem *.log | Rename-Item -NewName { $_.name -replace
'\.log$','.bak' }
"Настала заря информатизации" -replace "заря","эра"
Логические операторы Powershell
Оператор Описание
-and
Оба условия должны быть истины, чтобы выражение было истинно
-or
Одно или оба условия должны быть истины, чтобы выражение было
истинно
-xor
Одно условие должно быть истинно, а второе должно иметь значение
ложь, чтобы выражение было истинно
-not
Указанные условия должны иметь значение ложь, чтобы выражение было
истинно
!
Указанное условие должно иметь значение ложь, чтобы выражение было
истинно
Логические операторы PowerShell соединяют выражения и операторы, позволяя
использовать одно выражение для проверки нескольких условий.
Задача найти файлы определенного размера. А именно чтобы они были больше одного
числа но меньше другого.
Get-ChildItem|Where-Object {$_.length -gt 30000 -and $_.Length -lt
40000}
35
Список файлов в папке Windows объемом больше 30 Кбайт но меньше 40 Кбайт.
Задание №9. Операторы условий Powershell
Оператор IF
IF (если) — вычисляет значение заданное в круглых скобках (). Если результатом
вычисления является логическое True, то выполняется конструкция команд в фигурных
скобках {}. Если результат вычисления будет False выполнятся команды следующие за
фигурными скобками
$test_operator=$True
if ($test_operator)
{
Write-Host "УРА. Оператор имеет значение TRUE"
}
Результатом выполнения данного скрипта будет вывод в консоль фразы: УРА.
Оператор имеет значение TRUE. Если переменная $test_operator будет иметь
значение FALSE фразы указанной выше не появится, т.к. командлет выводящий данную
фразу на экран находится в {} скобка
Оператор ELSE
ELSE (иначе) — используется в связке с оператором IF. Оператор ELSE позволяет
определить что делать в случае если оператор IF не равен TRUE. Написание конструкции
состоит из оператора ELSE, далее идут фигурные скобки.
$proc=(Get-Process).ProcessName
if ($proc -like "notepad")
{
Write-Host "Блокнот запущен."
36
}
else
{start notepad}
В переменную $proc мы сохраняем список запущенных процессов с указанием вывода по
полю ProcessName. Далее оператором if сравниваем, есть ли в
переменной $proc запущенный процесс с именем notepad. Если есть, то выводим на экран
сообщение Блокнот запущен. Если такого процесса нет в ход идет конструкция else и
выполняет команды в фигурных скобках, то есть запускает notepad.
Данный скрипт конечно в простейшем варианте, но тоже пригоден и часто используется
системными администраторами. Очень удобно контролировать запущен ли конкретный
процесс и если нет запускать его.
Пример:
$proc=(Get-Process).ProcessName
$len=($proc -like "notepad").Length
if ($proc -like "notepad")
{
if ($len -ge 2)
{Write-Host "Количество запущенных блокнотов =" $len}
else {
Write-Host "Блокнот запущен."}
}
else
{start notepad}
В первом условии if мы сравниваем переменную $proc и в случае положительного
результата переходим в вложенному if. Во втором (вложенном) if мы сравниваем
переменную $len с двойкой. Если запущено 2 и более процесса notepad будет выведено
сообщение с указанием количества запущенных блокнотов. В случае 1 запущенного
блокнота будет сообщение Блокнот запущен. Если блокнот не запущен, в последнем
операторе else скрипт его запустит.
Задание №10. Оператор SWITCH
SWITCH — использует немного другой синтаксис для сравнения значений. Его
еще называют оператор переключения. В круглых скобках указывается выражение,
результат которого сравнивается со значениями в фигурных скобках.
37
$names = 'Даша'
switch ($names)
{
'Даша'
{
'Поздравляю вы выбрали Дарью'
}
'Машу'
{
'Вы выбрали Марию'
}
'Глафира'
{
'Вы выбрали Глафиру'
}
Default {"Вы никого не выбрали получайте Колю"}
}
В переменной $names мы указали имя Даша. Оно последовательно сравнивается с
каждым именем в фигурных скобках. Если не одно из имен не подошло, выполняется
действие указанное в параметре Default. Параметр default не обязательный можно его не
указывать. В случае отсутствия совпадения скрипт просто завершит работу.
Циклы Powershell
Циклы необходимы для повторного выполнения одинаковых операций с использованием
разных значений. Есть циклы обрабатывающие данные получаемые из конвейера
(ForEach-Object) и работающие отдельно (ForEach).
ForEach
Цикл ForEach служит для пошаговой переборки значений из коллекции элементов.
Обычно при помощи цикла foreach перебирают элементы в массиве. ForEach является
самым простым для понимания и чаще всего используемым циклом в Powershell. ForEach
не работает с конвейером для этого есть ForEach-Object.
foreach ($item in $collection)
{script block}
38
Переменная $collection это массив определенный заранее. Переменная $item —
это текущий элемент из $collection. По очереди перебираются все элементы из
массива $collection. Далее в фигурных скобках обычно вызывают
переменную $item обращаясь к текущему элементу коллекции.
Сценарий по удалению старых журналов сервера IIS:
$data=((Get-Date).Date).AddDays(-10)
$massiv=Get-ChildItem C:\script\ |Where-Object {$_.LastWriteTime -lt
$data}
foreach ($a in ($massiv).Fullname)
{
Remove-Item $a
}
Переменная с массивом чисел и в цикле:
$test=1,2,3,4,5
foreach ($name in $test)
{
$name+10
}
Сценарий постоянно проверяющий запущен ли процесс. Если процесс запущен то ничего
не делать, если не запущен то запустить:
$a=1
while($a -eq 1)
{
if ([bool](Get-Process notepad -ErrorAction SilentlyContinue) -eq
$true)
{Write-Host "Блокнот запущен! "}
else
{Start-Process notepad}
39
Start-Sleep -Seconds 30
}
В данном случае while проверяет $a=1, если да то выполнить набор команд. Но $a у меня
всегда 1 поэтому цикл будет бесконечный. Это образец скрипта для контроля
запущенного процесса.
For
Цикл For — обычно используется для создания цикла, выполняющего команды в
командном блоке пока указанное условие оценивается как верное ($True).
for ($z=2; $z -le 20; $z++)
{
Write-Host "Текущее значение переменной z="$z
}
Внешний ip адрес
$ip = new-object System.Net.WebClient
$ip.DownloadString("http://ipinfo.io/ip")
40
Проверить настройки DNS сервера, а также узнать IP адрес домена:
Get-DnsClientServerAddress
Resolve-DnsName yandex.ru
Используя командную строку (PowerShell) узнаем, прикреплѐн ли компьютер
к домену или входит в рабочую группу.
$ComputerSystem = Get-CimInstance -Class Win32_ComputerSystem;
$ComputerName = $ComputerSystem.DNSHostName
41
if ($ComputerName -eq $null) {
$ComputerName = $ComputerSystem.Name
}
$fqdn = ([System.Net.Dns]::GetHostByName($ComputerName)).HostName
$ComputerSystem | Microsoft.PowerShell.Utility\Select-Object `
@{ Name = "ComputerName"; Expression = { $ComputerName }},
@{ Name = "Domain"; Expression = { if ($_.PartOfDomain) { $_.Domain }
else { $null } }},
@{ Name = "DomainJoined"; Expression = { $_.PartOfDomain }},
@{ Name = "FullComputerName"; Expression = { $fqdn }},
@{ Name = "Workgroup"; Expression = { if ($_.PartOfDomain) { $null }
else { $_.Workgroup } }}
Заключение
В данном практикуме рассмотрены теоретические положения и
структура командной оболочки Windows PowerShell, рассмотрены варианты
выполнения простых и сложных процедур управления ресурсами
компьютерных систем. Надеемся, что степень изложения материала и
выполненные
лабораторные
работы помогут
более
эффективно
разрабатывать и эксплуатировать информационные системы в различных
областях деятельности.
42
Список используемой литературы
1. Гордеев, А.В. Операционные системы: учебник для вузов / А. В.
Гордеев. – 2-е изд. – Санкт-Петербург : Питер, 2007. – 416 с.
2. Назаров, С. В. Операционные системы. Практикум : учебное пособие
/ С. В. Назаров, Л. П. Гудыно, А. А. Кириченко. – Москва : КНОРУС, 2012. –
376 с.
3. Таненбаум, Э. Современные операционные системы / Э. Таненбаум.
– 3-е изд. – Санкт-Петербург : Питер, 2012. – 1120 с.
43
Download