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 комментариев »