sergey vasin

The IT blog

Weekend Scripter: Частичная PowerShell-автоматизация лучше чем ее полное отсутствие – Hey, Scripting Guy! Blog

leave a comment »

Резюме: Microsoft Windows PowerShell MVP Bartek Bielawski рассказывает об автоматизации посредством Windows PowerShell.

Microsoft Scripting Guy, Ed Wilson насвязи. Сегодня мы находимся в Варшаве, Польша, и встречаемся с особенным человеком — Microsoft Windows PowerShell MVP Bartek Bielawski. Bartek – победитель Scripting Games, также он автор нескольких постов в этом блоге. Кроме того что он очень любит WindowsPowerShell, он также довольной веселый человек. Я посчитал, что было бы здорово предоставить ему еще один шанс пообщаться с вами.

Итак, Bartek.

Windows PowerShell в первую очередь предназначен для автоматизации. Обычно это весьма здорово, если вы можете полностью автоматизировать задачу, однако бывают случаи, когда вы не можете автоматизировать ее целиком. Означает ли это, что вам не стоит автоматизировать процесс частично? Мой ответ — НЕТ. Я бы хотел поделиться двумя сценариями, когда мне не удавалось автоматизировать процесс полностью, но я решил написать скрипт, который выполняет ту часть работы, которая поддается автоматизации.

Первый случай относится к приложению инвентаризации, которое мы используем на работе. Давайте назовем его – NotFriendly (Недружелюбное). Хотя оно основано на SQL, мне так и не удалось найти способ напрямую подключиться к базе данных, чтобы произвести массовый импорт данных, которые находятся в другом приложении – Friendly (Дружелюбное). Мы написали процедуру для введения в NotFriendly информации о наших компьютерах. Это ручной процесс, который требует введения информации, которая уже содержится в приложении Friendly, но в несколько ином формате. И мне оставалось либо переизобретать колесо, либо использовать Windows PowerShell.

Для того, чтобы облегчить чтение информации из Friendly, я экспортировал ее в CSV-файл. Для того, чтобы данные соответствовали формату (и порядку) приложения NotFriendly, необходима некоторая трансформация. Но для начала, определим простую функцию, которую я буду использовать для вставки данных.

function Set-ClipBoard {

 param ([string[]]$Text)

foreach ($string in $Text) {

    [System.Windows.Clipboard]::SetText(

        $string

    )

     [System.Windows.Forms.MessageBox]::Show(

         «Clipboard set to: $string — OK!»

     )

 }

 }

Идея проста: Я запускаю эту функцию и передаю массив строк для каждого компьютера. Каждая строка попадает в буфер обмена, и кроме того я получаю окно с сообщением о том, что в текущий момент находится в буфере обмена. Остальное делает вручную – нажимаем OK, вставляем следующую фразу в требуемое поле, нажимаем OK… пока все данные не будут скопированы. А что же трансформация? Это смешанные данные из разных источников (базы данных с локальными административными паролями, ActiveDirectory и информация из системы Friendly):

$DataFromFriendlyInCsv | Foreach-Object {

     if (-not ($Sam = (Get-QADUser –LastName $_.User).SamAccountName)) {

         $SAM = $_.User

     }

     $Admin = $UserAdmin = ‘CHECK!’

     $Admin, $UserAdmin = Import-W7Pass -ComputerName $_.Shortcode |

         foreach { $_.Pass }

     $Passwords = «User Admin PW: {0} | Admin PW: {1}» -f $UserAdmin, $Admin

     $Date = Get-QADComputer -Name $_.ShortCode | foreach { $_.WhenCreated }

     $Formatted = «{0:d MMMM yyyy}» -f $Date

     Set-Clipboard $_.ShortCode,

         $_.Serial,

         $_.Class,

         $_.Product,

         $Sam,

         $_.Supplier,

         ‘Active’,

         ‘Computer’,

         $Formatted,

         ‘USES BUILD’,

         ‘PXL32DEP001V5’,

         $Passwords

 }

Как вы видите: некоторые поля статические и большинство информации берется их CSV. Некоторые поля берутся из различных источников, но на основе информации из CSV. До того как я написал скрипт, добавление одного компьютера занимало от 5 до 10 минут. С использованием скрипта это занимает 20 секунд. При этом полностью исчезли ошибки. Без использования скрипта зачастую появлялись ошибки, которые было достаточно сложно обнаружить, и зачастую это означало, что придется начинать все сначала.

Второй сценарий касается файла Excel, который с некоторых пор мне приходится обновлять ежедневно. Я был бы рад автоматизировать процедуру полностью, но он находится на системе, к которой я не могу (пока) подключиться через PowerShell (это сродни SharePoint, так как вместе с файлом хранятся метаданные). Но поскольку мне нужно всего лишь вставить «ежедневную строку» в файл Excel, я решил, что я могу автоматизировать сбор информации, поместить ее в буфер обмена и вставить в Excel. Мне все равно нужно знать текущие значения, поэтому вставка строки вручную – не такая уж большая проблема.

Файл содержит информацию о System Center: Configuration Manager (SCCM) 2007. У нас есть несколько коллекций, которым мы уделяем особенное внимание и собираем данные о числе объектов в каждой из них. Естественно, перед тем, как собрать данные, нам нужно убедиться, что коллекция обновлена (и мы получим актуальную информацию). Это делается вспомогательной функцией.

function Measure-Collection {

 [CmdletBinding()]

 param (

     $CollectionID,

     [switch]$Recurse,

     [string]$Filter

 )

     $Now = Get-Date

     $CollectionData = @{

         Class = ‘SMS_Collection’

         Filter = «CollectionID = ‘$CollectionID'»

     }

     Get-WmiObject @WMIStatic @CollectionData |

         ForEach-Object { $_.RequestRefresh($Recurse) } | Out-Null

     do {

         $Collection = Get-WmiObject @WMIStatic @CollectionData

         Start-Sleep -Seconds 1

     } until (

         $Collection.ConvertToDateTime(

             $Collection.LastRefreshTime

         ) -gt $Now

     )

     $Class = @{

         Class = «SMS_CM_RES_COLL_{0}» -f $CollectionID

     }

     if ($Filter) {

         $Class.Filter = $Filter

     }

     (Get-WmiObject @WMIStatic @Class | Measure-Object).Count

 }

Она использует WMI и подключается в серверу сайта. Информация о сайте хранится в $WMIStatic.

$WMIStatic = @{

     ComputerName = ‘Server’

     Namespace = «root\sms\site_{0}» -f ‘SiteCode’

 }

Скрипт использует эту функцию для измерения нескольких коллекций (включая SMS00001) и использует командлет Tee-Object для отображения информации на экране и сохранения ее в переменной:

Measure-Collection -CollectionID SMS00001 |

     Tee-Object -Variable All |

     Foreach-Object { «All {0}» -f $_ }

В итоге, я объединяю все эти данные с информацией о дате и времени (используя формат, соответствующий моим региональным настройкам), и подготавливаю данные для вставки в Excel:

$Date = «{0:yyyy-MM-dd}» -f (Get-Date)

 $Time = «{0:HH:mm}» -f (Get-Date)

 $Date, $Time, $All, $Windows, $PUR, $NoClient, $NA, $Dups -join «`t» | clip

Поскольку в буфере хранятся данные, разделенные знаком табуляции – каждое значение встанет в свою колонку. И это все: я просто запускаю скрипт и после его завершения вставляю данные в Excel. Я открываю файл так, как это требуется системой и необходимостью поддержания метаданных, относящихся к файлу. Большинство работы выполняет Windows PowerShell, хотя я и не нашел способа полностью автоматизировать эту задачу.

Вот что я хотел сказать этой статьей: Если есть какой-то процесс, который вы можете автоматизировать хотя-бы частично и избавить себя от ручной, повторяющейся работы – вы не должны раздумывать. Это в любом случае сохранит хотя бы несколько секунд вашего времени. И если вы сложите эти секунды вместе – могут получиться часы и даже дни.

~Bartek

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2012/12/02/weekend-scripter-some-powershell-automation-is-better-than-no-automation.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Written by Сергей Васин

Декабрь 8, 2012 в 14:32

Опубликовано в HeyScriptingGuyBlog, PowerShell

Tagged with

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s