[Из песочницы] Powershell для тестировщиков
Перед вами «быстрый старт» для работы с PowerShell для начинающих тестировщиков. Вы работаете и в один из дней, наконец, смиряетесь с тем фактом, что человек по сути своей ленивое существо, но при этом достаточно хитрое, чтобы облегчить себе жизнь. И, не долго думая, решаете автоматизировать повседневные задачи. Естественно, минимальными усилиями.У меня точно такая же проблема, поэтому давайте начнем вместе. Почти в каждой современной версии Windows уже установлено «расширяемое средство автоматизации от Microsoft, состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев». Использует оно «класссы» из .NET. На практике это значит, что мы можем работать с объектами.
На этом, пожалуй, закончим с теорией и приступим к практике. Запускаем команду «Выполнить» и пишем powershell. Появляется красивое окошечко приятного цвета. Почти все в powershelle делается через командлеты, которые похожие на всем нам знакомые функции.
Самый важный командлет это Get-Help. Он выводит справочную информацию. Например:
Get-Help Get-Help
— выдаст справку по Get-Help. Кстати, в консоли работает автодополнение по нажатию клавиши Tab.
Консоль — это, конечно, хорошо, но писать большие скрипты в ней не очень то удобно. Для этого есть Powershell ISE.Запускается по аналогии: «Выполнить» — powershell_ise.
Видим мини IDE c возможностью отладки и прочими приятностями. В ней же мы можем сохранить наши труды в готовые скрипты с расширением ps1.
Пишем наш первый скрипт, сохраняем и пытаемся выполнить. Потеря-потерь — ничего не получается. Дело в том, что по умолчанию отключено выполнение скриптов. Изменим это — запускаем PowerShell с админскими правами и пишем:
Set-ExecutionPolicy RemoteSigned
Тем самым, установив политику выполнения скриптов — разрешить запуск скриптов, исключая совсем уж сомнительные. Не безопасно, но на первое время пойдет.
Теперь настала пора более полезных вещей. Для начала будем анализировать логи. Используем Get-ChildItem, который, как видно из названия, дает нам дочерние, в том числе вложенные элементы из какой-нибудь папки.Собственно, сама папка задается параметром -Path.Include — помогает нам искать по маске, Recurse — значит что надо искать во вложенных папках.
В результате у нас получится что-то вида:
Get-ChildItem -Path «D:\Logs» -Include *.log -Exclude »!*» –Recurse
Здесь мы ищем все файлы с расширением .log, исключая файлы начинающиеся с !, в папке D:\Logs. Для дальнейшей работы нужно передать все объекты, что нашел Get-ChildItem на обработку. Делается это оператором | — он называется конвейер.
Get-ChildItem -Path $input_path -Include *.log -Exclude »!*» -Recurse | select-string -Pattern $text -Encoding «Default» -Context 0,10
Разберем то, что мы здесь понаписали: поочередно ищем в каждом файле, что дал нам Get-ChildItem строку совпадения по переменой $text. В этой переменной мы напишем строки, которые захотим найти в логах. -Encoding нужен для того, чтобы русский текст, если он есть в наших логах, отображался нормально, но не кракозябрами. -Соntext (начиная с Powershell версии 2.0) выводит вам строки до и после вхождения искомых символов.
Теперь о $text. Как вы уже заметили, переменные должны начинаться с символа »$».
$text = »(Fatal|Error|access|)«Используя регулярное выражение, мы ищем все строки, где есть или Fatal или Error или acces.
Скрипт, в принципе, готов, но чего-то не хватает. Мы даем ему кучу логов и на выходе получаем мешанину строк. Лучше причесать вывод и, по возможности, куда-нибудь сохранить для дальнейшего анализа. В этом нам поможет переменная $_ — грубо говоря, текущий объект, переданный нам. В нашем случае это будет конкретный файл с логом. Например, $_.FileName — имя файла, $_.LineNumber — номер строки, где совпал наш текст, ну и так далее. На выходе получаем:
$text = »(Fatal|Error|access)» Get-ChildItem -Path $input_path -Include *.log -Exclude »!*» -Recurse | select-string -Pattern $text -Encoding «Default» -Context 0,10 | foreach {@($_.FileName), @($_.LineNumber), @($_.Line), @($_.Context.PostContext)} > $output_file
> — запишет вывод в указанный файл.
Можно доработать наш скрипт под различные нужды. Например, надо определить, где метод выполнялся слишком долго. Мы знаем, что в нашем логе время выполнения метода пишется так — »(128 мс)». Поэтому надо найти всё, что выполняется больше 1000 мс. Меняем переменную $text=»(\d{3,} мс)» — это значит, будем искать «скобочку», за ней число, где не менее 3 знаков, затем пробел, потом символы «мс» и еще одну «скобочку».
Мы можем найти самую часто встречаемую ошибку, или метод:
Select-string -Pattern «data\d$» -Path input.txt | Group-Object Line | Sort-Object Count -Descending | Select Count, Name -First 2 > out.txt
Как это работает, я думаю, вы догадаетесь сами.
Закончим с логами и рассмотри еще одну задачу — обновления тестовых площадок. Разобьем на две части — копирование новых версий на тестовые машины, и непосредственно обновление.
Тут выясняется еще одно замечательное свойство Powershell. Из одного места мы можем запускать скрипты, которые будут применяться уже в других местах. Для этого достаточно выполнить команду:
Enable-PSRemoting -Force
Настройка должна выполняться на двух машинах — управляющей и управляемой. Тем самым мы включаем WS (http://en.wikipedia.org/wiki/WS-Management). Проверяется командой:
Test-WsMan COMPUTER
К удаленному компьютеру мы теперь можем обращаться так:
Invoke-Command -ComputerName COMPUTER -FilePath «d:\SCRIPT\script.ps1»
Script.ps1 выполнится на машине COMPUTER. Таким образом, с помощью Start-Process, и прочих команд, которые могут установить наше ПО, мы обновим тестовую площадку.
Но перед этим нам надо скопировать необходимые файл. Сделаем это так:
foreach ($computer in $computers) { if (test-Connection -Cn $computer -quiet) { Copy-Item $source -Destination \\$computer\$dest -Recurse } else { »$computer is not online» } }
Где, computers = @(«COMPUTER», «COMPUTER1», «COMPUTER2») — список наших серверов,$source = «c:\files» — папка, откуда мы будем копировать,$dest = «c$» — директория, куда мы будем копировать
Список вдохновляющих/полезных статейJump Start в PowerShell (часть I)Jump Start в PowerShell (часть II)Первые шаги для пауэршельшиковРегулярные выражения в PowershellПолезная программа для анализа регулярных выраженийНу вот, пожалуй, и все. Будьте здоровы, и чаще делайте бэкапы.