Custom View

А знаете ли вы что можно создавать свои настройки отображения (View) для форматирующих командлетов?

customformat

Например создадим свой View для отображения содержимого каталога который будет показывать не просто имя файла, а с полным путем. Ну и переименуем столбец Length в Size попутно отформатировав размер в более читабельный формат. Кроме того я убрал ставшую ненужной группировку по родительской папке при отображении файлов из нескольких каталогов.

Читать далее…

Реклама
Опубликовано в Learn, PowerShell. Комментарии к записи Custom View отключены

PowerGUI 1.0.13 на русском :)

Недавно вышла новая версия PowerGUI и входящего в комплект редактора с встроенным отладчиком — PowerGUI Script Editor (я сейчас использую для правки скриптов PowerShell именно его). Ну и для желающих доступна русификация 🙂 Русифицированные dll’ки можно скачать отсюда, и положить папку ru-RU в папку с установленным PowerGUI (по умолчанию «C:\Program Files\PowerGUI»). Если язык интерфейся операционной системы русский — то при следующем запуске русификация подхватится автоматически.

sed_rus

О ошибках локализации можно писать на xaegrr псина gmail.com 🙂

Опубликовано в PowerGui, PowerShell. 2 комментария »

Enable-RDP.ps1 + Disable-RDP.ps1

Сейчас понадобилось на нескольких машинках удаленно включить Remote Desktop, а ходить ставить галочки конечно лень 🙂 Ну вот и наваял парочку скриптиков на основе вот этого от /\/\O\/\/. Заодно являются примером удаленной работы с реестром.

 

Enable-RDP.ps1

# Массив имен компьютеров (или одно имя) param ([string[]]$ComputerName) # Объединяем имена полученные из параметра с полученными через конвейер ($input) # Делается для того чтобы можно было передать список компьютеров как через # аргументы, так и конвейром: Get-Content computers.txt | .\Enable-RDP.ps1 $ComputerName += @($input) # Для каждого компьютера из массива, выполняем процедуру... foreach ($Comp in $ComputerName) { Write-Verbose "Enabling RDP on $Comp" # Открываем улей (hive) реестра на другом компьютере. $regKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $Comp) # Переходим в нужный ключ. $True подтверждает что открываем на запись. $regKey = $regKey.OpenSubKey("SYSTEM\\CurrentControlSet\\Control\\Terminal Server" ,$True) # Устанавливаем значение fDenyTSConnections равным 0. $regkey.SetValue("fDenyTSConnections",0) # Сохраняем изменения $regKey.flush() # Закрываем ключ $regKey.Close() }

Второй скрипт отличается одной цифрой. Можно было конечно сделать Set-RDP и указывать включение и отключение с помощью аргумента, но мне показалось что Enable/Disable будет красивее и более в духе PowerShell 🙂

 

Disable-RDP.ps1

param ([string[]]$ComputerName) $ComputerName += @($input) foreach ($Comp in $ComputerName) { Write-Verbose "Disabling RDP on $Comp" $regKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $Comp) $regKey = $regKey.OpenSubKey("SYSTEM\\CurrentControlSet\\Control\\Terminal Server" ,$True) $regkey.SetValue("fDenyTSConnections",1) $regKey.flush() $regKey.Close() }

Ну и пробуем:

[PS C:\...\Scripts] Get-Content C:\Temp\computers.txt | .\Enable-RDP.ps1 -Verbose ПОДРОБНО: Enabling RDP on pc10 ПОДРОБНО: Enabling RDP on pc4 ПОДРОБНО: Enabling RDP on pc12 [PS C:\...\Scripts] .\Disable-RDP.ps1 pc11 -v ПОДРОБНО: Disabling RDP on pc11
Опубликовано в PowerShell. Комментарии к записи Enable-RDP.ps1 + Disable-RDP.ps1 отключены

Send-SmtpMail.ps1

Очень часто возникает необходимость отправить почтовое сообщение из скрипта, например отчет о выполнении, или какие-нибудь логи.

В комплекте PowerShell Community Extensions есть превосходный командлет Send-SmtpMail, но что делать если по каким то  причинам установка сторонних оснасток является проблемой? Ну или просто хочется сделать скрипт для которого нужен только сам PowerShell? А оказывается всё не так уж сложно. Ниже — скрипт который является простеньким аналогом вышеупомянутого командлета. Конечно это не полный клон по функционалу, но на большинство задач хватит, да и расширить не проблема.

Send-SmtpMail.ps1

param ( $Server = $SmtpHostPreference, # SMTP Сервер $From = $SmtpFromPreference, # Адрес отправителя [string[]]$To, # Получатели $Body = "", # Тело сообщения $Subject = "", # Тема сообщения [System.IO.FileInfo[]]$Attachment=@() # Вложения ) Write-Verbose "Создаем объекты SmtpClient и MailMessage" $SmtpClient = New-Object System.Net.Mail.SmtpClient $Message = New-Object System.Net.Mail.MailMessage Write-Verbose "Устанавливаем свойства этих объектов" $SmtpClient.Host = $Server $Message.Body = $Body $Message.Subject = $Subject $Message.From = $From Write-Verbose "Создаем и добавляем вложения" $Attachment | ForEach-Object { $a = New-Object System.Net.Mail.Attachment($_.fullname) $Message.Attachments.Add($a) } Write-Verbose "Добавляем получателей" $To | ForEach-Object {$Message.To.Add($_)} Write-Verbose "Отправляем сообщение" $smtpclient.Send($Message) Write-Verbose "Удаляем объекты" $Message.Dispose()

В скрипте я использовал командлет Write-Verbose, он выполняет две роли: Во-первых если указать ключ -Verbose при запуске скрипта, то эти сообщения будут выведены на экран. Ну и во-вторых — комментарии писать уже не нужно 🙂

Применять скрипт можно например так:

.\Send-SmtpMail.ps1 -to ктото@гдето.ru -server pochtovik -from дядя@гдето.ru -subject test -verbose

Или так:

$SmtpHostPreference = "pochtovik.domain.local" $SmtpFromPreference = "дядя@гдето.ru" .\Send-SmtpMail.ps1 -to ктото@гдето.ru -subject test -body "Hello there!" -attachment (dir c:\files\*.txt)

Причем $SmtpHostPreference и $SmtpFromPreference можно задать в профиле, и тогда не придется их указывать при каждом вызове скрипта.

PS: Для работы скрипта, должна быть разрешена анонимная отправка сообщений по SMTP. Хотя можно прикрутить и аутентификацию.

Опубликовано в PowerShell. 5 комментариев »

Notepad

Когда вы получаете сообщение об ошибке в скрипте, оно ссылается на некоторый номер строки и столбец на котором произошла ошибка. Ну и конечно хочется перейти на указанную строку и посмотреть, где же возникла проблема. Многие используют редакторы вроде Notepad2, Notepad++ или еще чего-нибудь покруче. Но почему-то часто забывают что номер строки можно посмотреть и в обычном Notepad, который идет в комплекте с любой Windows. Достаточно отключить Word wrap (перенос по словам) в меню «Сервис», и включить строку состояния в меню «Вид» 🙂

lines

А если нажать Ctr+G то можно перейти на строку с указанным номером:

image

Опубликовано в Uncategorized. 8 комментариев »

XML Output

Во многих утилитах Vista и Windows 2008 есть ключик позволяющий вывести результаты в формате XML. Это сделано в первую очередь для удобства автоматизации. А автоматизировать проще всего в PowerShell 😉

Возьмем например команду appcmd.exe с помощью которой можно просматривать и изменять конфигурацию IIS7.0. Так как команда находится в подпапке system32\inetserv\ то проще сделать альяс для неё чем постоянно указывать полный путь:

Set-Alias appcmd $env:windir\System32\inetsrv\appcmd.exe'

Кстати рекомендую сразу поместить в профиль.

Теперь посмотрим список виртуальных каталогов на сервере:

[PS C:\root] appcmd list vdir
VDIR "Default Web Site/" (physicalPath:%SystemDrive%\inetpub\wwwroot)
VDIR "Default Web Site/TS/" (physicalPath:C:\Windows\web\ts\)
VDIR "Default Web Site/Rpc/" (physicalPath:C:\Windows\System32\RpcProxy)
VDIR "Default Web Site/RpcWithCert/" (physicalPath:C:\Windows\System32\RpcProxy)

Каждый виртуальный каталог в своей строчке… Конечно лучше чем в iis6… Но хотелось бы работать с этим выводом как с обычными объектами PowerShell, применять Where, использовать ConvertTo-Html, или просто отформатировать в виде таблицы… Можно конечно распарсить с помощью регекспов, но это писать новое выражение для каждого типа объектов… Да и ошибиться несложно. Лучше преобразовать вывод в формат XML. Ну и укажем соответствующий ключик:

appcmd list vdir /xml

Вот только красивее не стало… PowerShell естественно не ожидает от обычной консольной команды вывода нормальных xml объектов, поэтому просто показывает всё как есть — тоесть как текст… Ну чтож, скажем ему что это всё-таки XML:

[xml]$result = appcmd list vdir /xml

Теперь в переменной $result у нас содержится вывод команды в формате xml. И можно посмотреть xml объекты например так (кстати .appcmd.VDIR дополняется с помощью клавиши табуляции):

[PS C:\root] $result.appcmd.VDIR

physicalPath                  path APP.NAME                     VDIR.NAME
------------                  ---- --------                     ---------
%SystemDrive%\inetpub\wwwroot /    Default Web Site/            Default Web ...
C:\Windows\web\ts\            /    Default Web Site/TS          Default Web ...
C:\Windows\System32\RpcProxy  /    Default Web Site/Rpc         Default Web ...
C:\Windows\System32\RpcProxy  /    Default Web Site/RpcWithCert Default Web ...

Ну и уже можно работать как привычно 🙂

[PS C:\root] $result.appcmd.VDIR | where {$_.physicalPath -like "*rpcproxy"} | F
ormat-Table *path -a

physicalPath                 path
------------                 ----
C:\Windows\System32\RpcProxy /
C:\Windows\System32\RpcProxy /

Или в одну строку:

([xml](appcmd list vdir /xml)).appcmd.vdir
physicalPath                  path APP.NAME                     VDIR.NAME
------------                  ---- --------                     ---------
%SystemDrive%\inetpub\wwwroot /    Default Web Site/            Default Web ...
C:\Windows\web\ts\            /    Default Web Site/TS          Default Web ...
C:\Windows\System32\RpcProxy  /    Default Web Site/Rpc         Default Web ...
C:\Windows\System32\RpcProxy  /    Default Web Site/RpcWithCert Default Web ...

Но самое главное: точно также, можно работать с любыми другими объектами вывода любой другой команды умеющей выводить результаты в XML!

Опубликовано в PowerShell, Windows 2008. Комментарии к записи XML Output отключены

Еще новости про сертификации по Windows 2008

Открылись разделы на оффсайте:

 

Кстати, вчера и позавчера сдавал 71-646 и 71-647 (71 потому что бета версия). Впечатления следующие:

Читать далее…

Опубликовано в Certifications, Windows 2008. Комментарии к записи Еще новости про сертификации по Windows 2008 отключены