Курс по PowerShell (6434A) в моём исполнении :)

teacher1 10-12 марта, в Москве, в учебном центре Инвента, я буду читать курс по Windows PowerShell. Это официальный Microsoft’овский курс – 6434A — Automating Windows Server 2008 Administration with Windows PowerShell. С его программой можно ознакомиться тут.

Хотя в названии и фигурирует Windows Server 2008 – большая часть информации касается PowerShell вообще, независимо от операционной системы, а Windows Server 2008 используется лишь для демонстрации функционала PowerShell.

Курс подойдет и для людей совсем не знакомых с PowerShell, и для уже обладающих некоторыми знаниями. Обучение начинается с установки PowerShell и рассмотрения базового функционала. Затем идёт работа с конвейерами, форматированием вывода, и конструкциями контроля выполнения, и т.д. Ближе к концу вы научитесь использовать возможности PowerShell для работы с WMI, ADSI, COM, и .NET на реальных примерах. В курсе много лабораторных работ, что очень важно для хорошего усвоения материала.

Внимание, бонус! Курс не ограничивается программой курса 🙂 Если мы будем укладываться по времени – можно пытать меня всевозможными вопросами, я с удовольствием расскажу вам всё что знаю о PowerShell, лишь бы это было интересно и другим слушателям 🙂

Продолжительность курса – 3 дня, с 9 утра, до 17 вечера.

Стоимость – 13500 руб.

Записаться можно тут. И лучше сделать это пораньше, так как количество мест ограничено.

До встречи 🙂

Создание локального пользователя и мешающее ничто

Недавно ко мне обратились с вопросом о странном поведении достаточно простой функции. Она создаёт локального пользователя с заданным именем и паролем, и должна возвращать в качестве результата объект с двумя свойствами: UserName и Password (Ну на самом деле функция была чуть сложнее, но нам интересна только эта часть 🙂 ). Читать далее…

Опубликовано в Learn, PowerShell, Scripting, Tips. Метки: . 3 комментария »

Выдираем ссылки из вебстранички

Для большинства случаев использования регулярных выражений в PowerShell применяются операторы -match, -replace, и командлет Select-String. Но иногда их возможностей недостаточно, и тогда на помощь приходит класс [regex] принося всю мощь регулярных выражений .Net 🙂 Одно из самых простых его применений — выборка из куска текста нескольких вхождений одного выражения. Для примера — достанем ссылки из кода вебстраницы. Сразу замечу что выражение определяющее url не точное, но в большинстве случаев его будет более чем достаточно.
Итак, для начала объявим функцию для загрузки кода веб-страницы (это обновлённая версия Get-WWWString):

function Get-WwwString ([string]$Url, [string]$Encoding="windows-1251", [System.Management.Automation.PSCredential]$ProxyCredential = $GlobalCreds)            
{            
        $wc = new-object System.Net.WebClient            
        $wc.Encoding = [System.Text.Encoding]::GetEncoding($Encoding)            
        $wc.UseDefaultCredentials = $true            
        if ($ProxyCredential) {$wc.Proxy.Credentials = $ProxyCredential.GetNetworkCredential()}            
        $wc.DownloadString($url)            
}

Теперь загружаем страницу, и вытаскиваем ссылки…

$Text = Get-WwwString "http://ya.ru"            
            
[regex]$reg = '"(\w+://[^"]+)"'            
$match = $reg.match($Text)            
while ($match.Success)            
{            
    $match.Groups[1].value            
    $match = $match.nextMatch()            
}
Опубликовано в 2.0, Learn, PowerShell, Scripting. Метки: . Комментарии к записи Выдираем ссылки из вебстранички отключены

Как создать свой объект в PowerShell

Пост чтоб ссылаться на него, а то часто спрашивают 🙂

Самый красивый и правильный способ – использовать командлеты New-Object, и Add-Member:

$obj = New-Object psobject            
$obj | Add-Member -type noteproperty -name Prop1 -Value "Abc"            
$obj | Add-Member -type noteproperty -name Prop2 -Value 123

К сожалению этот способ относительно громоздкий, и при написании “ad-hoc” скриптов, или в интерактивной консоли, часто используют командлет Select-Object. Он оставляет от переданного ему объекта только указанные свойства. Причем свойства можно указывать даже отсутствующие у объекта раньше 🙂 А вместо имён свойств можно использовать специальные хеш-таблицы в которых еще и указывать их значения 🙂

$o = 0 | Select-Object @{name="Prop1";expression={"Abc"}}, @{n="Prop2";e={123}}

Мы передаём на Select-Object объект 0 (ноль), впрочем можно использовать и любой другой, например "" (пустую строку). Ни одно из свойств исходного объекта мы не указываем и они удаляются. Зато добавляем пару новых 🙂

Ну и до кучи – хэш-таблицы (hashtable). Это не объекты, но ведут себя в некоторых случаях довольно похоже.

$h = @{prop1="Abc";prop2=123}            
$h["prop3"]=456            
$h.prop1 = "Def"

Обратите внимание на такую фичу – к свойствам хеш-таблиц можно обращаться как к массивам по индексу — $h["свойство"], так и как к объектам: $h.свойство.

Upd: Спасибо Вадиму за напоминание, в PowerShell 2.0 можно еще вот так легко создать свой класс с помощью кода C#, и затем его экземпляр:

Add-Type @'
public class MyClass
{
    public string prop1 = "blabla";
    public bool prop2 = true;
}
'@            
            
$Object = New-Object MyClass

Аналогично можно сделать и в 1.0, но там вызывать C# код уже несколько сложнее.

Удаление дублей папок RSS в Outlook

Я недавно описывал как делается удаление всех папок из папки RSS в Outlook, но не все решили совсем отказаться от использования любимого Outlook’а в качестве RSS ридера 🙂 Некоторым надо лишь удалить дубликаты папок. Для этого надо добавить совсем немного изменений 🙂

$outlook = New-Object -com outlook.application
$ns = $Outlook.GetNamespace("MAPI")
$Rss = $ns.getdefaultfolder(25)
$rss.Folders | ?{$_.Name -match '\(\d+\)$'} | %{$_.Name; $_.delete()}

Однако будьте осторожны, таким образом будут удалены все папки заканчивающиеся на цифру в скобках, так что если у вас есть нужные папки с таким названием – сначала переименуйте их.

Кстати, при подключении к Outlook из сценариев, иногда возникает такое вот окно:

OutlookAutomation

Кто нибудь знает как можно его отключить?  Очень бы пригодилось для сценариев автоматизации Outlook запускаемых через планировщик.

Мой $Prompt

Хотите такую же строчку приглашения себе? 🙂

prompt1

Выводится порядковый номер каждой команды, уровень вложенности оболочек и текущий путь. Причем средняя часть длинных путей заменяется многоточием, оставляя лишь диск или имя компьютера, и последнюю папку в пути. Ну и если оболочка запущена с административными привилегиями, то приглашение выводится красным цветом.

Нижеследующий код можно добавить себе в файл $profile и тогда он будет активироваться автоматически при каждом запуске PowerShell.

$IsElevated=$false            
foreach ($sid in [Security.Principal.WindowsIdentity]::GetCurrent().Groups) {            
    if ($sid.Translate([Security.Principal.SecurityIdentifier]).IsWellKnown([Security.Principal.WellKnownSidType]::BuiltinAdministratorsSid)) {            
        $IsElevated=$true            
    }            
}            
            
function prompt 
{            
 [Environment]::CurrentDirectory=(Get-Location -PSProvider FileSystem).ProviderPath            
 $path = (Get-Location).path -replace '^(.*?[^:]:\\).+(\\.+?)$',('$1'+[char]8230+'$2') -replace '^.+?::' -replace '^(\\\\.+?\\).+(\\.+?)$',('$1'+[char]8230+'$2')            
 $id = ([int](Get-History -Count 1).Id) + 1            
 $prefix = "[PS <$id> "            
 if ($NestedPromptLevel){$prefix += "($NestedPromptLevel) "}            
 if ($isElevated) {$Color = "Red"} else {$Color = "White"}            
 write-host $prefix -ForegroundColor $Color -NonewLine            
 write-host ($path) -foregroundcolor "Gray" -NonewLine            
 write-host "]" -ForegroundColor $Color -NonewLine            
 " "            
}            

Пользуйтесь на здоровье 🙂

Опубликовано в Learn, PowerShell, Scripting, Tips. Метки: , , , . 15 комментариев »

Эффективное программирование в Windows PowerShell

posh

Как обычно я опаздываю с новостями 🙂 А новости у нас между тем хорошие – Сергей Вальковский недавно закончил перевод на русский язык книги Keith Hill – Effective PowerShell. Книга по сути является подборкой нескольких постов в блоге Keith, но тем не менее очень полезная. В ней рассказывается о некоторых проблемах и возможностях PowerShell, знание о которых будет очень полезно всем серьезно занимающимся PowerShell. Книга ориентирована на подготовленного читателя, так что не прочитав прилагающейся документации не стоит за неё даже браться. А всем остальным – настоятельно рекомендую к прочтению.

Отдельно хочу похвалить качество перевода – он действительно хорош. Ну кроме второй половины 9ой главы 🙂 (её переводил я 😉 ).

Книгу можно скачать например здесь.

ЗЫ: Ну и для тех кто всё же предпочтет читать в оригинале – вот.