Главная страница
Навигация по странице:

  • Проверка условий с помощью командлета if

  • Вывод в виде HTML

  • Работа с файлами

  • Поиск информации об объектах с помощью Get-Member

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

  • Создание папок

  • Windows PowerShell


    Скачать 0.93 Mb.
    НазваниеWindows PowerShell
    АнкорWindows_Powershell_RU
    Дата22.05.2020
    Размер0.93 Mb.
    Формат файлаpdf
    Имя файлаWindows_Powershell_RU.pdf
    ТипКнига
    #124664
    страница2 из 4
    *") {$_ -Replace "", ""} else {$_ -Replace "", ""}} > .\get-service.html
    Выходной файл должен выглядеть похоже на то, что приведено ниже. В принципе, этот пример работает так же, как Write-Host, но здесь отдельные строки файла HTML переформированы: команда HTML для столбца таблицы задает зеленый или красный фоновый цвет bgcolor green или bgcolor red . Поскольку не все знают HTML, этот пример приведен, как исключение, с полным кодом решения.

    Рисунок 6: Цветной вывод HTML с использованием преобразования HTML

    Работа с файлами
    В следующих нескольких упражнениях мы будем работать с файлами. Если эта книга используется как часть курса, попросите тестовые файлы у преподавателя. Если вы работаете с упражнениями самостоятельно, просто создайте отдельную папку для упражнений. Для этого скопируйте в папку несколько разных файлов (например, 40). Если вы не можете их найти, воспользуйтесь файлами из своего Интернет-кэша. Вы должны убедиться, что используете файлы как минимум двух разных типов, но их может быть и больше.
    Работа с файлами в Windows PowerShell по-настоящему проста. Можно использовать псевдонимы популярных команд, таких как dir или ls. Для команды cd следует учитывать, что между командой и путем должен стоять пробел: «cd ..», а не «cd..»!
    Windows PowerShell превращает все файлы в объекты. Размер файла можно прямо запросить, его не придется выделять из строки. Кроме того, Windows PowerShell может работать не только в классической файловой системе. С помощью командлета Get-
    Psdrive вы можете вывести все диски, к которым Windows PowerShell позволяет осуществлять доступ. Диски выделяются двоеточием после их имени (:).
    Выведите список всех дисков Windows PowerShell. Переключитесь (cd) на диск HKLM:.
    Введите команду cd software. Введите команду dir. Где вы теперь находитесь?
    Переключитесь на диск ENV:. Выведите его содержимое командой ls, как если бы это была обычная папка Unix. В конце переключитесь на диск CERT: и выведите список содержимого, используя командлет Get-Childitem.
    Вы увидите, что от Windows PowerShell невозможно скрыться почти нигде на вашем компьютере. Команды dir, ls и Get-Childitem всюду имеют одинаковые возможности.
    Это означает, что вы можете использовать те псевдонимы, которые вам больше нравятся.
    Чтобы оставаться в рамках синтаксиса Windows PowerShell, я буду говорить в основном о
    Get-Childitem. Еще одно замечание о реестре. Если вы когда-нибудь разбирались с реестром, то отметили, что по нему можно перемещаться при помощи команд dir и cd, но они не позволяют просмотреть значения ключей реестра. Причина в том, что значения реестра являются свойствами объектов реестра, в то время как размер (Size) или дата последнего изменения (Date last accessed) – это свойства файла. Чтобы увидеть значения реестра, необходима команда Get-ItemProperty. Эта команда выводит все свойства элемента реестра и их значения. Дополнительные сведения можно найти, как и ранее, в справке по Windows PowerShell.
    Чтобы упростить работу с тестовыми файлами, мы создадим в Windows PowerShell новый диск, который будет указывать на реальную тестовую папку. Для этого необходимо выполнить команду New-Psdrive.
    Создайте новое устройство, введя команду. Измените конец пути так, чтобы он указывал на вашу папку с тестовыми файлами:
    New-PSdrive -Name FK -Psprovider FileSystem -Root c:
    c:
    c:
    c:\W,)bWW+
    Затем воспользуйтесь командой cd FK
    FK
    FK
    FK:
    :
    :
    :, чтобы перейти в эту папку и проверьте, в нужной ли папке вы находитесь. Если это не так, используйте команду Remove-PSDrive
    FK для удаления устройства и попробуйте еще раз.
    Следующие упражнения продемонстрируют вам обширные возможности Windows
    PowerShell.

    Переключитесь на свой учебный диск: cd fk fk fk fk:
    :
    :
    : (В синтаксисе PowerShell, кстати, это будет выглядеть так: Set-Location fk fk fk fk:
    :
    :
    :). Выведите список содержимого с помощью команды Get-Childitem. Скройте все временные файлы: Get-Childitem * -Exclude
    *.tmp, *.temp
    B1: Выведите только имена и длину файлов, игнорируя временные файлы с расширениями temp или tmp.
    Подсказка: Используйте те же методы, что и для вывода процессов и служб.
    Рисунок 7: Вывод имен и длины файлов без файлов TMP
    Чтобы свести к минимуму количество вводимой информации, Windows PowerShell предлагает различные способы сокращения команд. Введите Get-Alias | Sort-Object
    Definition и увидите список всех возможных псевдонимов команд. Однако для автоматического дополнения параметров необходимо точно ввести псевдоним, не ошибаясь в количестве букв, в том числе не добавляя лишних букв. Итак, Get-Childitem
    * -Exclude *.tmp | Select-Object name, length превратится в ls * -ex *.tmp
    | select n*, le*
    B2: Отсортируйте файлы в порядке возрастания по размеру (длине), затем по имени.
    Подсказка: Используйте те же методы, что и для вывода процессов в предыдущих примерах.
    Поиск информации об объектах с помощью Get-Member
    Используйте командлет Get-Member, чтобы просмотреть все атрибуты и функции объекта. Для использования этой команды следует передать объект Get-Member через конвейер. Вы можете даже передать список одинаковых объектов Get-Member, который сможет правильно с ним разобраться.
    B3: Создайте список всех возможных атрибутов файла с помощью командлета Get-
    Member. Отсортируйте все файлы по дате последнего доступа.

    Подсказка: Используйте результат работы функции Get-Member и «угадайте» нужные атрибуты из списка свойств.

    Команда Group-Object может разделить список объектов на группы. Для этого необходимо использовать в качестве аргумента один из атрибутов объекта. Get-Service
    | Group-Object status затем создаст новый список, содержащий две (или более) записей. Удобно, что будет также показано число служб и их статус:
    Рисунок 8: Результаты работы командлета Group-Object
    B4: Сгруппируйте полученные файлы по расширению. Затем отсортируйте их, используя число файлов с каждым из расширений.
    Подсказка: Выведите файлы, сгруппируйте их и отсортируйте новый список по числам.
    Для этого используйте аргумент count.
    Кроме Get-Member для получения информации об объектах можно использовать еще один командлет, Measure-Object. Даже если вы не полностью знаете список параметров, используемых в Measure-Object, можно как минимум оценить его возможности на следующих примерах. Попытайтесь понять, какие результаты даст следующая цепочка команд:
    Get-Childitem | Measure-Object length -Average -Sum -Maximum
    -Minimum
    Возможно, после нескольких прочтений вы захотите проверить свои догадки. Все будет отлично работать и с использованием символов подстановки, и для обычных конвейеров командлетов Windows PowerShell.
    B5: Определите общий размер всех файлов TMP. На втором шаге выведите ТОЛЬКО общий размер.
    Подсказка: После первой попытки поместите всю строку в (). После запуска цепочки повторите команду с добавлением Get-Member для вывода всех атрибутов для получения результата (Вы помните? Windows PowerShell работает с объектами и переводит их в текст, так что их можно прочитать на экране!). Найдите свойство, которое соответствует вашим результатам в (), которое может также соответствовать атрибуту «Total». Помните цикл
    ForEach и как вы находили свойство «Status»? Да, именно: «object.status». А здесь нам нужен «total», а не «status». Измените текст примера соответствующим образом.
    Удаление файлов
    Windows PowerShell также содержит все необходимые команды для удаления файлов.
    Используя командлет Remove-Item можно удалять не только файлы. Он работает аналогично Get-Childitem. Может быть будет разумно создать резервную копию папки с упражнениями. Если вы случайно удалите слишком многое, вы сможете по крайней мере начать сначала.

    B6: Удалите все файлы TMP с помощью Remove-Item с нужными аргументами!
    Иногда возникает необходимость удалить файлы, значения параметров которых выходят за нужные нам границы. В этом случае можно использовать командлет Where-
    Object. Как и для команды if, мы можем определить состояние, которому должны удовлетворять выбираемые объекты из списка. Давайте рассмотрим пример со службами.
    Используя Get-Service | Where-Object {$_.status -Eq "stopped”} можно просмотреть только остановленные сервисы.
    B7: Теперь удалите все файлы более 2 МБайт. 2 МБайт приблизительно соответствуют 2000000 байт.
    Подсказка: Создавайте свой финальный сценарий шаг за шагом. Сначала создайте список всех файлов и отфильтруйте их по размеру (…length -Gt 2000000). Вы получите новый список, который можно обрабатывать в цикле. Затем выведите только имена файлов
    ($_.fullname). Эти имена можно использовать для запуска Remove-Item. Каждый раз, когда вам надоест слишком длинная строка команд, вводите переменные.
    Кстати, вы не можете ввести 2 МБ как 2000000 (кроме всего прочего, это лишь приблизительное значение). Лучше прямо ввести в качестве размера 2MB, Windows
    PowerShell отлично понимает такой формат. Можно также потребовать сосчитать сумму
    512KB + 512KB. Для вычислений требуется просто ввести числа непосредственно в командную оболочку, использовать особые командлеты не требуется.
    Создание папок
    Теперь попробуем внести в хаос наших файлов некоторый порядок . Мы создадим отдельные подпапки для файлов всех типов, а затем переместим соответствующие файлы в папки. Для этого нам нужен командлет для создания нового «элемента»
    1
    в файловой системе: New-Item. Он использует имя как аргумент, а тип как параметр, например, directory для каталога. Вы можете создать новый каталог «Test» следующим образом:
    New-Item .\test -Type Directory
    Чтобы упростить вам жизнь, мы еще раз рассмотрим команду сортировки: Get-
    Service | Sort-Object status вы уже знаете, а теперь попробуем
    Get-Service | Sort-Object status -Unique
    Эта последовательность команд возвращает только один элемент для каждого статуса. Попробуйте ее выполнить. Теперь у вас есть все, что нужно для создания папок и каталогов.
    B8: Создайте в папке с упражнениями отдельные подпапки для файлов с разными расширениями.
    Подсказка: Создайте список файлов и выберите их только по атрибуту «Extension».
    Теперь рассортируйте их с параметром -Unique. Вы увидите список расширений файлов
    Когда это будет сделано, вы сможете присвоить этот список переменной и перейти к следующему шагу – с помощью цикла пройти по списку объектов и создать подпапки с именами расширений (.extension).
    Помните, что для этого следует использовать полный путь с как минимум одним символом
    1
    Такие файловые системы, как FAT или NTFS, не являются на самом деле объектно- ориентированными. Поэтому мы используем команду New-Item, а не New-Object. В будущем это может измениться.

    «\». Если с путем возникают проблемы, попробуйте использовать в качестве аргумента
    (".\New”+$_.Extension). Не забывайте указать тип объекта (directory) для создания каталога.
    Для перемещения файлов в нужное место мы используем команду Move-Item. В качестве аргументов этот командлет использует полное имя исходного объекта и путь, указывающий на конечное положение, например, Move-Item .\test.txt .\*BWW
    B9: Переместите все файлы из тестовой папки в созданные подпапки.
    Подсказка: Список Get-Childitem из оригинальной папки теперь содержит новые подпапки, которые следует фильтровать. Создайте новый список всех элементов (сначала внимательно просмотрите список).
    Отфильтруйте список с помощью оператора сравнения по регулярному выражению
    (…type -Notmatch "d”). Затем следует применить к списку, который теперь содержит только файлы, цикл. Последний шаг прост: для каждого объекта найдите соответствующую расширению файла папку и переместите файл в эту папку. Для сохранения промежуточных результатов всегда можно использовать переменные.
    Рисунок 9: папка с файлами до сортировки
    Рисунок 10: папка с файлами после сортировки
    И наконец, мы снова выводим все эти файлы. Исходная папка теперь будет пуста, а подпапки заполнены. Get-Childitem -Recurse покажет это в деталях. Давайте сохраним эти результаты в файл TXT, чтобы вы могли изучить его в Блокноте (Notepad).
    B10: Выведите содержимое папки с упражнениями, включая все подпапки, в текстовый файл, и сохраните его под именем FinalOutput.txt.
    B11: Если у вас имеется исходные файлы упражнений, вы можете сделать еще одну вещь: Чтобы еще более упростить себе жизнь, можно сбросить атрибут read-only для каждого файла Word. Для этого перейдите в подпапку для файлов .doc и вызовите все объекты. Атрибут объекта, который следует установить, называется IsReadOnly, ему следует присвоить значение 0 (числовой ноль).
    Подсказка: Используйте две команды: создайте список всех объектов, а затем с помощью цикла пройдите по объектам, как делали это раньше в других упражнениях.

    Windows PowerShell также поможет вам с ACL, вашими спецификациями защиты.
    Используя командлеты Get-Acl и Set-Acl, вы легко можете переносить их от одного объекта к другому и даже создавать новые. Однако это выходит за рамки нашего курса.
    Дополнительные сведения по ACL можно найти в интерактивной справке.
    Рисунок 11: Вывод содержимого подпапок
    1   2   3   4
    1   2   3   4
    Вывод в цвете
    Иногда бывает необходимо выделить результаты, сделав их удобнее для чтения. Это можно сделать, например, с помощью выделения цветом. Команда Write-Host распознает некоторые параметры, такие как -Foregroundcolor и -Backgroundcolor. Как вы думаете, какой результат получится после выполнения этой команды?
    Write-Host "Red on blue" -Foregroundcolor red -Backgroundcolor blue
    Вы можете угадать. Get-Help Write-Host -Detailed даст вам полный список возможных цветов. Также существуют определенные заранее сочетания: вы можете также привлечь внимание пользователя с помощью команды Write-Warning "error".
    Попробуйте сделать это прямо сейчас. С помощью этой команды вы можете окрасить все данные, выводимые процессами. Однако будет лучше, если вы раскрасите список в соответствии с дополнительными условиями. Давайте подробнее рассмотрим эту возможность.
    Для простоты мы используем службы ПК, а не процессы. Если вы не знаете, что такое службы, посмотрите сведения о них, например, в MSDN. Просто скажем, что службы – это то, что показывается в окне Control Panel / Administrative Tools / Services. Что нам важно знать о службах, это то, что они имеют статус «запущена» или «остановлена» («started» или
    «stopped»), которое можно использовать для окрашивания выводимых данных. Но для начала просмотрим службы с помощью командлета Get-Service.
    A5: Создайте список всех служб и отсортируйте их по статусу.
    Подсказка: Используйте тот же метод, что и для сортировки процессов по используемому времени процессора, но применяйте команду get-service и «status» в качестве аргумента командлета Sort-Object.
    Мы хотим вывести весь список красным цветом. В этом нам поможет командлет
    Write-Host. К сожалению, команда Get-Service | Write-Host -Foregroundcolor red не будет работать так, как мы ожидаем. Write-Host не дружит с другими командлетами и не принимает список объектов, который следует затем вывести нужным цветом. Команда Write-Host должна знать, какой атрибут каждого объекта следует выводить таким образом. Мы можем немного помочь ей с этим. Будем работать со списком объектов последовательно, используя цикл. Существует множество циклов, каждый из которых имеет свои особенности и области использования. Для наших нужд мы воспользуемся циклом ForEach-Object, который проходит по списку объектов и передает каждый объект по отдельности следующему за ним командлету. В цикле мы выбираем нужный объект с помощью сокращения $_, особого «служебного имени» PowerShell. Затем мы выбираем атрибут объекта, вот так: $_./B-(*0()*. Давайте рассмотрим пример:
    Get-Process | ForEach-Object { Write-Host $_.ProcessName $_.CPU}
    Хотя Get-Process дает нам список процессов, в этом примере мы можем просмотреть только имя и используемое время процессора, так как сначала выводимые данные уходят в канал (|), а затем Write-Host извлекает из него только два атрибута каждого объекта. Если вы вызовете пример еще раз, не удивляйтесь результату: не все процессы используют время процессора, так что в определенных условиях строка может содержать только имя.
    A6: Создайте список служб и выведите на экран только атрибуты имени и статуса.
    Воспользуйтесь ранее описанным циклом ForEach, но можете подумать и о других возможных решениях.

    Теперь мы можем использовать параметры Write-Host для вывода в цвете.
    A7: Создайте список служб и выведите на экран только атрибуты имени и статуса, используя цвета по желанию. Покажите цвета своему соседу и решите, у кого получилось самое красивое сочетание.
    Подсказка: Воспользуйтесь решением из A6 и добавьте параметры -
    Foregroundcolor и -Backgroundcolor.
    Рисунок 4: Вывод имен и статусов служб красным цветом
    Проверка условий с помощью командлета if
    Мы пропустили еще одну вещь – проверку условий. Для этого существует множество вариантов, подходящих для различных сценариев. Однако сейчас, в этом введении, мы ограничимся командой If. Вы, возможно, уже знаете ее синтаксис из других вариантов использования, он довольно прост:
    If (,(2*/+) {*VW2B+V+ V}
    Elseif (,(2*/+2) {*VW2B+V+ V}
    Else {*VW2B+V+ V}
    Elseif – необязательная часть, необходимости в ней нет. Если вы хотите выполнить в области {} более одной команды, их можно разделять точкой с запятой или использовать для каждой команды новую строку. Windows PowerShell будет ожидать завершающей } в конце.
    Для сравнения Windows PowerShell использует несколько операторов сравнения. Они все начинаются с «-» и обычно содержат аббревиатуру из двух латинских букв: -eq означает «equals», «равно». Наиболее важные операторы перечислены ниже:
    -Eq
    Равно
    -Match
    Сравнение по регулярному выражению
    -Ne
    Не равно
    -Notmatch
    Не совпадает с регулярным выражением
    -Gt -Ge
    Больше / Больше или равно
    -Lt -Le
    Меньше / Меньше или равно
    Последнее упражнение в этом блоке содержит одновременно все варианты отслеживания статуса системы с использованием PowerShell. Все службы в системе
    сначала сортируются по статусу, а затем выводятся с выделением цветом: службы со статусом «stopped» красным, службы со статусом «running» зеленым.
    A8: Вызовите список служб. Отсортируйте список по статусу и окрасьте выводимые данные в красный или зеленый цвет в зависимости от статуса службы «stopped» или
    «running».
    Подсказка: Сначала используйте Sort-Object, как в предыдущих упражнениях.
    Затем воспользуйтесь циклом Foreach, но вместо того, чтобы просто использовать Write-
    Host, добавьте запрос If. Вы можете просмотреть статусы служб, используя как обычно
    $_.status; возможные значения «stopped» или «running».
    О синтаксисе: Оператор If помещается в скобки (), а команда вывода в скобки {}.
    Игнорируйте теоретические параметры и для простоты не пользуйтесь запросом Elseif.
    Не забудьте конечную фигурную скобку в ForEach! Когда вы дойдете до конца строки >>, закройте ее, дважды нажав Return для выполнения введенных строк.
    Еще раз выполните выражение, но на этот раз без командлета Sort-Object. Чтобы не вводить все данные второй раз, воспользуйтесь клавишами курсора.
    Командлет Foreach-Object можно сократить до ForEach. Его можно сделать еще короче, но тогда вы не сможете прочитать его, не зная смысла значка. Поэтому здесь мы будем использовать варианты Foreach-Object или ForEach.
    Рисунок 5: Цветные сведения о службах
    Вывод в виде HTML
    Пример A8 можно использовать для мониторинга серверов. Теперь было бы полезно упростить повторное использование выводимых данных. Вы уже знаете, как выводить данные в виде CSV и XML. Однако существует и еще одна возможность, иногда более полезная: HTML. Для этого используется командлет Convertto-Html. При этом данные выводятся не в виде файла, как в случае других командлетов, а в форме, позволяющей осуществлять редактирование непосредственно в канале. В конце можно перенести текст в файл, чтобы, например, вам было легче просматривать его в веб-браузере. С помощью серии мини-примеров мы покажем различные возможности, доступные с помощью
    Convertto-Html.
    A9: Преобразуем выходные данные Get-Service в HTML. Используем командлет
    Convertto-Html, который может работать непосредственно со списком объектов.
    Подсказка: Если список слишком длинный, его можно оборвать, нажав CTRL-C.

    A10: В конце воспользуемся командами, которые, как мы знаем, помещают выходные данные в файл «.\A10.html». Просмотрим этот файл.
    Подсказка: Можно использовать команду Invoke-Item .\a10.html для запуска веб- браузера по умолчанию и вывода в него файла прямо из PowerShell. Не забудьте правильно указать путь к A10.html. Если хотите, можете открыть файл с помощью Проводника.
    Convertto-Html позволяет ограничить выводимые данные, чтобы список не стал нечитаемым. На вход Convertto-Html следует подавать список выводимых объектов, т.е.
    … | Convertto-Html -Property name, status.
    A11: Продолжение A10: Создайте более привлекательную веб-страницу и список с именами и статусами всех служб. Можно также перед преобразованием отсортировать выводимые данные по статусу.
    Подсказка: Ваша командная строка теперь будет состоять из 4 команд: вывести список всех служб, отсортировать их по статусу, преобразовать в HTML, вывести как файл.
    Поскольку Convertto-Html создает текст HTML, результат можно легко модифицировать, если у вас есть опыт работы с HTML. Это не задача Windows PowerShell, но PowerShell может вам помочь. Попытайтесь понять, что делает этот код, прежде чем скопировать, вставить и выполнить его в Windows PowerShell:
    Get-Service | ConvertTo-Html -Property name,status | Foreach {
    If ($_ -Like "*
    Running


    написать администратору сайта