Feeds:
Записи
Комментарии

Archive for the ‘PowerShell V4’ Category

Что нам потребуется:

  • Аккаунт на gmail.com
  • Включенный Imap(Настройки – Пересылка и POP/IMAP)

image

  • Скачать библиотеку ImapX — https://imapx.codeplex.com за авторством Павла Азанова – за что ему большая благодарность

Для использования данной библиотеки сначала ее надо загрузить:

Add-Type -Path "C:\IMAPX\v4.5\InterIMAP.dll"

1) Подключение к почтовому серверу Imap

ImapX позволяет указать сервер, порт и шифрование тремя различными способами:

1. С помощью одного из параметризованных конструкторов при инициализации нового ImapClient

2. Используя свойства клиента

3. Настройка параметров подключения прямо при вызове метода Connect


Инициализация клиента:

#Без SSL, порт по умолчанию (143) для соединения
$client= New-Object ImapX.ImapClient("imap.gmail.com") 

#С поддержкой SSL, порт по умолчанию (993) для соединения
$client = New-Object ImapX.ImapClient("imap.gmail.com",$true) 
#С поддержкой SSL, порт по умолчанию (993) для соединения, 
#    отключить проверку сертификата
$client = New-Object ImapX.ImapClient("imap.gmail.com",$true,$false)  

#Без SSL, с указанием порта для соединения
$client = New-Object ImapX.ImapClient("imap.gmail.com",888) 

#С поддержкой SSL, с указанием порта для соединения
$client = New-Object ImapX.ImapClient("imap.gmail.com",888,$true) 

#С поддержкой SSL, с указанием порта для соединения, 
#    отключить проверку сертификата
$client = New-Object ImapX.ImapClient("imap.gmail.com",888,$true,$false) 

#С поддержкой TLS, с указанием порта для соединения, 
#    отключить проверку сертификата
$client = New-Object ImapX.ImapClient("imap.gmail.com",888,
    [System.Security.Authentication.SslProtocols]::Tls,$false) 

Подключение:

if($client.Connect( # опциональные параметры # )) {# подключение прошло успешно}
else {
     # подключиться не удалось
}

Какие параметры можно передать методу Connect:

bool Connect()                                                                                                                                                           
bool Connect(string host, bool useSsl, bool validateServerCertificate)                                                                                                   
bool Connect(string host, int port, bool useSsl, bool validateServerCertificate)                                                                                         
bool Connect(string host, int port, 
    System.Security.Authentication.SslProtocols sslProtocol, 
    bool validateServerCertificate) 

2) Аутентификация

ImapX – поддерживает два встроенных метода: логин — пароль и OAuth2.

# Используя связку Логин - Пароль
$client = New-Object ImapX.ImapClient("imap.gmail.com","993",$true,$true)

if($client.Connect()) {  
    if($client.Login("address@gmail.com", "password")) {
        # подключение прошло успешно    }
}
else {
    # подключиться не удалось
}
# Используя OAuth2
$client = New-Object ImapX.ImapClient("imap.gmail.com","993",$true,$true)

if($client.Connect()) {   
    $credentials = New-Object`
        ImapX.Authentication.OAuth2Credentials("login", "token")

    if($client.Login(credentials)) {
        # подключение прошло успешно     
}
}
else {
    # подключиться не удалось
}

3) Работа с папками

В Gmail папки не используются,вместо них есть ярлыки,но будем считать папка = ярлык.

Для доступа к папкам воспользуемся свойством Folders(для нашего примера $client.Folders) класса ImapX.ImapClient.

Просмотр общих папок:

ImapX обеспечивает прямой доступ ко всем общим папкам как Inbox, Drafs, Trash и другие. Учтите, что это не всегда возможно определить эти папки, так как не все сервера предоставляют необходимую информацию .

Общие папки по умолчанию:

PS >  [ImapX.Collections.CommonFolderCollection].GetProperties().Name

All

Archive

Inbox

Drafts

Important

Flagged

Junk

Sent

Для выбора определенной папки,можно воспользоваться индексом массива или методом Item:

# Просмотр папок почтового ящика
PS > $client.Folders.Name
INBOX
[Gmail]
Личные
Путешествие
Работа
Счета

# Выберем папку вся почта
PS > $client.Folders.All

Exists                : 6
Recent                : 0
Recents               : 0
Unseen                : 0
SubFolders            : {}
Messages              : {}
GMailThreads          : {}
HasChildren           : False
Name                  : Вся почта
Selectable            : True
Path                  : [Gmail]/&BBIEQQRP- &BD8EPgRHBEIEMA-
FolderPath            : [Gmail]/&BBIEQQRP- &BD8EPgRHBEIEMA-
Flags                 : {\HasNoChildren, \All}
AllowedPermanentFlags : {}
UidNext               : 1357
UidValidity           : 624695359
SubFolder             : 

# Выберем папку входящая почта
$client.Folders.Inbox
$client.Folders.Item("INBOX")
$client.Folders[0]
$client.Folders["INBOX"]
# Просмотр подпапок(свойство SubFolders)
PS > $client.Folders.Item("[Gmail]").SubFolders.Name
Важное
Вся почта
Корзина
Отправленные
Помеченные
Спам
Черновики

Создание папок:

# Создадим папку -  Новости
PS > $client.Folders.Add("Новости")

Exists                : 0
Recent                : 0
Recents               : 0
Unseen                : 0
SubFolders            : {}
Messages              : {}
GMailThreads          : {}
HasChildren           : False
Name                  : Новости
Selectable            : True
Path                  : &BB0EPgQyBD4EQQRCBDg-
FolderPath            : &BB0EPgQyBD4EQQRCBDg-
Flags                 : {}
AllowedPermanentFlags : {}
UidNext               : 1
UidValidity           : 624695382
SubFolder             : 

# Создадим подпапку BBC в разделе Новости
$client.Folders["Новости"].CreateFolder("BBC")

или

$client.Folders["Новости"].SubFolders.Add("BBC")

PS > $client.Folders["Новости"].SubFolders.Add("BBC")

Exists                : 0
Recent                : 0
Recents               : 0
Unseen                : 0
SubFolders            : {}
Messages              : {}
GMailThreads          : {}
HasChildren           : False
Name                  : BBC
Selectable            : True
Path                  : &BB0EPgQyBD4EQQRCBDg-/BBC
FolderPath            : &BB0EPgQyBD4EQQRCBDg-/BBC
Flags                 : {}
AllowedPermanentFlags : {}
UidNext               : 1
UidValidity           : 624695384
SubFolder             : 

Переименование папок:

# Для переименования достаточно изменить свойство Name

PS  >  $client.Folders[«Новости«].Name =«Кино«

 

Удаление папок:

# Удалим папку Кино
PS > $client.Folders["Кино"].Remove()
True

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

Lazy или Full

По умолчанию ImapX загрузит два уровня  дерева папок при обращении к свойству Folders. Вложенные папки, которые глубже —  по требованию. Если вы хотите получить  всю структуру папок при первом запросе,  измените поведение клиента:

$client.Behavior.FolderTreeBrowseMode = «Full»

Автоматическая проверка папок

По умолчанию ImapX проверяет папки (например, запрашивает общее количество сообщений и последние сообщения), когда структура дерева загружается. Если вам не нужно эту информацию сразу же, вы можете отключить автоматическое обследование:

$client.Behavior.ExamineFolders = $false

4) Работа с сообщениями

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

Определить глобальный тип загрузки для сообщений:

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

# Возможные значения свойства — MessageFetchMode

PS > [enum]::GetNames("ImapX.Enums.MessageFetchMode")
Flags
InternalDate
Size
Headers
BodyStructure
Tiny
Minimal
Body
Basic
Attachments
Full
GMailMessageId
GMailThreads
GMailLabels
GMailExtendedData
None
ClientDefault

$client.Behavior.MessageFetchMode = «Basic»

MessageFetchMode.Tiny — флаги,заголовки и структура тела письма

MessageFetchMode.Minimal — флаги,заголовки,структура тела письма,размер и внутреннюю дату

MessageFetchMode.Basic — флаги,заголовки,структура тела и тело письма,размер и внутреннюю дату

MessageFetchMode.Full — флаги,заголовки,тело письма,вложения,размер и внутреннюю дату

Доступ к  сообщениям:

По умолчанию коллекция Messages  объекта Folder будет пустым. Для загрузки сообщений, воспользуемся метод Download:

# Загрузим все сообщения из папки All
$client.Folders.All.Messages.Download()

# Загрузим первые 3 сообщения из папки All
$client.Folders.All.Messages.Download("All",-1,3)
# Загрузим 1 сообщения из папки Inbox от YouTube
$client.Folders.Inbox.Messages.Download('FROM "YouTube"',-1,1)

Если вы не хотите вызвать метод Download  для каждой папки, можно просто задать поведение клиента для автоматического заполнения коллекции Folder.Messages.

$client.Behavior.AutoPopulateFolderMessages = $true

Запрос сообщений используя  метод Folder.Search:

Также можно использовать метод Folder.Search для запроса сообщений. Все найденные сообщения будут возвращены методом Search будут  добавлены к коллекции Folder.Messages. Метод Messages.Download() вызывает метод Folder.Search, поэтому оба метода принимают одинаковые параметры.

PS > $client.Folders.Inbox.Search

OverloadDefinitions
——————-
ImapX.Message[] Search(string query, ImapX.Enums.MessageFetchMode mode, int count)
ImapX.Collections.MessageCollection Search(string path, bool makeProcess) – Является устаревшим и не испольуется

# Найти все сообщения в папке INBOX
$client.Folders.Inbox.Search()

# Найти первое сообщение в папке INBOX
$client.Folders.Inbox.Search(1)

# Найти пятое сообщение в папке INBOX
$client.Folders.Inbox.Search(5)

# Найти первые пять сообщений в папке INBOX( 0x19 - MessageFetchMode.Tiny)
$client.Folders.Inbox.Search("All",0x19,5)

Для формирования фильтра,более подробно можно прочитать в RFC 3501 пункт 6.4.4.

# Найти все сообщения в папке INBOX
$client.Folders.Inbox.Search()

# Найти первое сообщение в папке INBOX
$client.Folders.Inbox.Search(1)

# Найти пятое сообщение в папке INBOX
$client.Folders.Inbox.Search(5)

# Найти первые пять сообщений в папке INBOX( 0x19 - MessageFetchMode.Tiny)
$client.Folders.Inbox.Search("All",0x19,5)

# Найдем сообщения, где в теле письма(BODY) есть YouTube
$client.Folders.Inbox.Search('BODY "YouTube"',0x19,-1)

# Найдем все сообщения от YouTube
$client.Folders.Inbox.Search('FROM "YouTube"')

# Найдем сообщения первое сообщение от YouTube
$client.Folders.Inbox.Search('FROM "YouTube"',0x19,1)

date            = date-day "-" date-month "-" date-year
date-day        =1*2DIGIT
date-month      ="Jan"/"Feb"/"Mar"/"Apr"/"May"/"Jun"/"Jul"/"Aug"/"Sep"/"Oct"/"Nov"/"Dec"
# Найдем сообщения полученные от 1 декабря 2013 года
$client.Folders.Inbox.Search('SINCE "01-DEC-2013"')

# Найдем сообщения полученные  30 ноября 2013 года
$client.Folders.Inbox.Search('ON "30-NOV-2013"') 

# Найдем сообщения в тему у которых есть слово Windows
$client.Folders.Inbox.Search('SUBJECT "Windows"')

Скачивание вложений:

# Просмотр вложений
$m.Attachments

# Имя файла
$m.Attachments.ContentType.Name

# Прежде,чем сохранить или работать с Steam,требуется загрузить Download()
$m.Attachments.Download()

# Проверить загрузку объекта
$m.Attachments.Downloaded

# Сохраним вложение
$m.Attachments.Save("C:\files",$m.Attachments.ContentType.Name)

Копирование сообщений:

# Скопируем сообщение в папку Trash
$m=$client.Folders.Trash.Search('FROM "test@xxx.ru"')
$m[0].CopyTo($client.Folders.Trash,$true)

Удаление сообщений:

# Найсти все сообщений от YouTube и удалить
$client.Folders.Inbox.Search('FROM "YouTube"') | 
    ForEach-Object {$_.Remove()}

Работа с флагами:

# Флаги сообщения
$m=$client.Folders.Trash.Search('FROM "test@xxx.ru"')
$m.Flags

# Добавим флаг \SEEN
$m=$client.Folders.Trash.Search('FROM "test@xxx.ru"')
$m.Flags.Add("\SEEN")

# Удалим флаг \SEEN
$m=$client.Folders.Trash.Search('FROM "test@xxx.ru"')
$m.Flags.Remove("\SEEN")

Экспорт сообщений:

# Экспорт сообщения в файл
$m=$client.Folders.Inbox.Messages[0]
$m.Save("C:\message.eml")
$m.SaveTo("C:\","message.eml")

5) Отключение от почтового сервера Imap

# Disconnect
$client.Disconnect()
Remove-Variable -Name client

PS. Если Вам понравилась библиотека ImapX, Вы можете выразить благодарность Павлу Азанову:

Donate

Реклама

Read Full Post »

1) Новый общий параметр PipelineVariable

PipelineVariable позволяет вам сохранять результаты переданной по конвейеру команды (или часть переданной по конвейеру команды) как переменную, которая может передаваться далее через конвейер.

Список общих параметров в PowerShell 4.0

PS >  [Management.Automation.Internal.CommonParameters].GetProperties().Name
Verbose
Debug
ErrorAction
WarningAction
ErrorVariable
WarningVariable
OutVariable
OutBuffer
PipelineVariable

PS >  [Management.Automation.Internal.CommonParameters].GetProperty(«PipelineVariable»).GetCustomAttributes(«AliasAttribute»).AliasNames
pv

Формат(значение переменной без знака $):

-PipelineVariable <String>

            Alias: pv

Пример:

Получить список служб, отфильтровать по свойству DependentServices(если службы  зависят от данной службы) и вывести результат в формате RootService,Name

PS >  Get-Service | Where DependentServices |
Foreach {($s=$_)}| Select -Exp DependentServices  | Select @{n=»RootService»;e={$s.Name}},Name

RootService                                        Name
——-                                                     —-
AudioEndpointBuilder                   AudioSrv
BFE                                                         SharedAccess
BFE                                                         RemoteAccess
BFE                                                         PolicyAgent
BFE                                                         NisSrv
BFE                                                         NisDrv
BFE                                                         MpsSvc
BFE                                                         IKEEXT
CryptSvc                                              AppIDSvc
Dhcp                                                     WinHttpAutoProxySvc

Общий параметр PipelineVariable позволяет нам избавиться от Foreach {($s=$_)}|

PS >  Get-Service -PipelineVariable s| Where DependentServices |
Select -Exp DependentServices  | Select @{n=»RootService»;e={$s.Name}},Name

RootService                                        Name
——-                                                     —-
AudioEndpointBuilder                  AudioSrv
BFE                                                         SharedAccess
BFE                                                         RemoteAccess
BFE                                                         PolicyAgent
BFE                                                         NisSrv
BFE                                                         NisDrv
BFE                                                         MpsSvc
BFE                                                         IKEEXT
CryptSvc                                              AppIDSvc
Dhcp                                                     WinHttpAutoProxySvc

Получить  список модулей процесса PowerShell и вывести результат в формате ProcName,ModuleName,FileSystemRights,IdentityReference

Get-Process powershell -PipelineVariable p | Foreach {$_.Modules} -pv m |
Foreach {(Get-Acl $_.FileName).Access} |
Select @{n=»ProcName»;e={$p.Name}},@{n=»ModuleName»;e={$m.ModuleName}},FileSystemRights,IdentityReference

 

ProcName   ModuleName       FileSystemRights IdentityReference
———           ———-                   —————- ——————
powershell powershell.exe   ReadAndExecute, Synchronize NT AUTHORITY\SYSTEM
powershell powershell.exe   ReadAndExecute, Synchronize BUILTIN\Administrators
powershell powershell.exe   ReadAndExecute, Synchronize BUILTIN\Users
powershell powershell.exe   FullControl NT SERVICE\TrustedInstaller
powershell ntdll.dll                   ReadAndExecute, Synchronize NT AUTHORITY\SYSTEM
powershell ntdll.dll                   ReadAndExecute, Synchronize BUILTIN\Administrators
powershell ntdll.dll                   ReadAndExecute, Synchronize BUILTIN\Users
powershell ntdll.dll                   FullControl NT SERVICE\TrustedInstaller

 

Предосторожности при работе с общим параметром PipelineVariable:

1) Указывать имя переменной без знака  — $_

2) Не использовать с командами, которые «блокируют» конвейер (Sort-Object,Group-Object,Measure-Object, оператор () и т.д. )

Данные команды,сначала объединяют все данные из конвейера,  производят действия над объектами и передают вывод дальше, тем самым «блокируют» конвейер.

(Get-Service -PipelineVariable s) | Foreach {$s} – Получим пустой вывод

PS >  Get-Process -PipelineVariable p | Sort Id | Foreach {«$($p.Name) has $($_.Modules.Count)»}
WLIDSVCM has 0
WLIDSVCM has 0
WLIDSVCM has 0
WLIDSVCM has 0
WLIDSVCM has 5
WLIDSVCM has 0

3) Переменная удаляется после выхода из конвейера

2) Изменение в поведении свойства DefaultCommandPrefix в манифесте модуля

Данный ключ позволяет предотвратить конфликты в названии имен команд модуля, путем добавления префикса. Параметр –Prefix командлета Import-Module имеет приоритет над свойством DefaultCommandPrefix(Т.е. если в манифесте DefaultCommandPrefix=»ABC»,а при импорте модуля  Import-Module MyModule –Prefix ZZZ ,то у команд будет префикс ZZZ).

В Windows PowerShell 3.0 если модуль использует свойство DefaultCommandPrefix в своем манифесте или если пользователь импортирует модуль с параметром Prefix свойство ExportedCommands модуля показывает команды в модуле без префикса. Команды также могут быть запущены без префикса, с использованием  синтаксиса: ModuleName\CommandName

В Windows PowerShell 4.0 если модуль использует ключ DefaultCommandPrefix в своем манифесте, или если пользователь импортирует модуль с параметром Prefix свойство ExportedCommands модуля показывает команды в модуле с префиксом. При запуске команды с помощью модуля используя синтаксис ModuleName\CommandName, имена команд должны включать префикс.

Пример:

Предположим, в манифесте модуля  SampleModule определено свойство DefaultCommandPrefix  с префиксом «Abc» и экспортирует командлет Get-SampleCommand.

В Windows PowerShell 3.0:

C:\> $m = Get-Module SampleModule -ListAvaiable
C:\> $m.ExportedCommands | Format-List
Key : Get-SampleCommand
Value : Get-SampleCommand

 

В Windows PowerShell 4.0:

C:\> $m = Get-Module SampleModule -ListAvailable
C:\> $m.ExportedCommands | Format-List
Key : Get-AbcSampleCommand
Value : Get-AbcSampleCommand

 

Как мы видим, что корректные данные получаем только в PowerShell 4.0.

В Windows PowerShell 3.0:
C:\> Import-Module SampleModule
C:\> SampleModule\Get-SampleCommand
<no error — command is executed>

C:\> SampleModule\Get-AbcSampleCommand
<CommandNotFoundException>

В Windows PowerShell 4.0:
C:\> Import-Module SampleModule
C:\> SampleModule\Get-SampleCommand
<CommandNotFoundException>

C:\> SampleModule\Get-AbcSampleCommand
<no error — command is executed>

В PowerShell 3.0 при указании префикса мы получим исключение(команда не найдена – CommandNotFoundException) , без префикса исключение не возникает и происходит выполнение команды. В PowerShell 4.0 при указании префикса исключения не возникает и происходит выполнение команды, без указания возникает исключение(команда не найдена – CommandNotFoundException) .

 

Workaround: Для PowerShell 3.0 можно воспользоваться module-qualified  синтаксисом:

Import-Module ActiveDirectory -Prefix ABC
$m = Get-Module ActiveDirectory
& $m Get-ABCADUser -Filter *

3) Изменения в отладчике Windows PowerShell 4.0

Данный пункт был заимствован у Paul Higinbotham(Windows PowerShell team) — Remote Script Debugging in Windows PowerShell

Отладчик в Windows PowerShell 4.0 включает два основных улучшения: возможность отладки сценариев в удаленных сессиях и поддержка workflow(также в удаленных сенсах). В предыдущих версиях Windows PowerShell  отладка  сценариев была ограничена только локальной машиной. При использовании точек останова в предыдущих версиях Windows PowerShell в удаленных сеансах приводило к возникновению ошибок. В Windows PowerShell 4.0 можно установить точки останова в удаленных сеансах и отлаживать удаленный запуск сценариев из командной строки Windows PowerShell  , что и при отладке на локальном компьютере. Для использования удаленной отладки, требуется чтобы версия Windows PowerShell на исходном и конечном компьютере была 4.0. Кроме того в консоли Windows PowerShell поддерживается удаленная отладка, но она не поддерживается в Windows PowerShell ISE.

Отладка сценариев в Windows PowerShell консоли всегда начинается одинаково. Для этого используйте Set-PSBreakpoint , чтобы задать точку останова: строку, команду или переменную  в сценарии, а затем запустить скрипт. Когда дойдет до точки останова, выполнение скрипта останавливается и консоль переходит в режим отладчика.

Командная строка изменяется, чтобы указать, что консоль работает в режиме отладки, и из этой строки, можно выполнить команды, такие как Help (‘h’, ‘?’), List source (‘list’, ‘l’), Show call stack (‘k’), и  команды возобновления (например, Continue, StepInto, и StepOut).

Пример 1:  Отладка скриптов в консоли

PS > Set-PSBreakpoint -Script C:\DebugTest1.ps1 -Line 1

ID Script                      Line Command                     Variable                   Action
— ——                      —- ——-                     ———                   ——
0 DebugTest1.ps1                 1

PS > C:\DebugTest1.ps1
Entering debug mode. Use h or ? for help.

Hit Line breakpoint on ‘C:\DebugTest1.ps1:1’

At C:\DebugTest1.ps1:1 char:1
+ $Title = «Debugging Test»
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
[DBG]: PS >> stepOver
At C:\DebugTest1.ps1:2 char:1
+ $Count = 100
+ ~~~~~~~~~~~~
[DBG]: PS >> $Title
Debugging Test
[DBG]: PS >> Get-Process powershell

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
——-  ——    ——      —— ——   ——     — ————
360      26    76180      84356   617     2,11   3024 powershell

[DBG]: PS >>

Процесс отладки удаленного сценария Windows PowerShell  почти идентичен локальной отладки. Отладка – это интерактивный процесс, так для отладки сценария в удаленном сеансе, необходимо сначала установить интерактивный сеанс с которого можно отлаживать. Это делается с помощью командлета Enter-PSSession, где вы можете ввести существующий удаленный сеанс или создать новый. Для отладки сценариев в удаленной сессии для начала требуется установить интерактивную сессию. Это делается с помощью командлета Enter-PSSession с помощью него можно установить новую сессию или указать существующий сеанс.

Пример 2: Создание нового удаленного сеанса и запуск интерактивной сессии

PS C:\> Enter-PSSession –ComputerName localhost
[localhost]: PS C:\>

Существует одно существенное отличие между отладкой локальных и удаленных сценариев. Когда отладка и вывод данных остановлен в отладчике во время удаленной отладки скриптов, данные поступают на клиенте через отдельные и асинхронные потоки. Потому что мы не хотели,чтобы перезаписывались выходные данные   или другая отладочная информации, Windows PowerShell подавляет выходные данные сценария в то время как отладчик находится в режиме остановки(Stop). Недостатком является то, что некоторые выходные данные сценария могут прибыть позже, чем ожидалось.

Пример 3: Консоль удаленной отладки скриптов

Для использования удаленной отладки, требуется чтобы версия Windows PowerShell на исходном и конечном компьютере была 4.0.

PS C:> Enter-PSSession $env:COMPUTERNAME
[SRV]: PS C:> Set-PSBreakpoint DebugTest1.ps1 1

ID Script                      Line Command                     Variable                   Action
— ——                      —- ——-                     ———                   ——
0 DebugTest.ps1                  1

[SRV]: PS C:> .\DebugTest1.ps1
Entering debug mode. Use h or ? for help.

Hit Line breakpoint on ‘C:\DebugTest1.ps1:1’

At C:\DebugTest1.ps1:1 char:1
+ $Title = «Debugging Test»
+ ~
[SRV]: [DBG]: PS C:>> list 1

1:* $Title = «Debugging Test»
2:  $Count = 100

[SRV]: [DBG]: PS C:>> stepOver
At C:\DebugTest1.ps1:2 char:1
+ $Count = 100
+ ~
[SRV]: [DBG]: PS C:>>

 

Отладка в отключенных сеансах

Удаленная отладка Windows PowerShell также поддерживает отключенные сеансы, которые были добавлены в Windows PowerShell 3.0. Сценарий отладки состояние  остановки(Stop)  сохраняется в отключенном сеанс, что позволяет отлаживать сценарий, когда соединение будет восстановлено.

В Windows PowerShell 3.0 удаленный сеанс может быть отключен одним из двух способов.Первым из них является ручной отключение, при выполнении командлета Disconnect-PSSession или Invoke-Command –InDisconnectedSession. Во-вторых, через надежные соединения — автоматическое отключение. То есть, если в сеансе теряется сетевое подключение, то сеанс автоматически отключается после четырех минут при попытке восстановить сетевое подключение.

В Windows PowerShell 4.0, есть и третий путь отключения удаленного сеанса , при достижении точки останова в скрипте в удаленном сеансе. Сценарий в удаленном сеансе останавливается в отладчике, и удаленный сеанс отключается от клиента. Для отладки или продолжения сценария, вы должны использовать командлет Enter-PSSession  для установки  интерактивного сеанса отладки с консоли Windows PowerShell. В сеансе отладки, вы можете отлаживать скрипт или продолжить выполнение скрипта.

Вы можете определить, является ли отключенный сеанс остановленным в отладчике, подключившись к нему через Connect-PSSession, и, глядя на свойство Availability сеанса. Если он остановлен в отладчике, Availability == ‘RemoteDebug’.

После того, как удаленный сеанс остановлено в отладчике и отключен, у вас есть только два варианта о том, как поступить с сессией. Сессии можно отлаживать с помощью командлета Enter-PSSession, или вы можете убить сессии с помощью командлета Remove-PSSession.

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

Чтобы продолжить, необходимо отладить удаленного сценария в интерактивном сеансе с использованием командлета Enter-PSSession. В этой интерактивной сессии можно выполнить отладку сценария или пусть скрипт выполняеться до завершения, удалив все точки останова и использовать команду Continue отладчика.

 

Пример 4: Отладка отключенного сеанса

PS > $session = Invoke-Command -Cn localhost -ScriptBlock { Set-PSBreakpoint C:\DebugTest1.ps1 5;C:\DebugTest1.ps1 } -InDisconnectedSession
PS > $session

Id Name            ComputerName    State         ConfigurationName     Availability
— —-            ————    ——         ——————     ————
2 Session1        localhost       Disconnected  Microsoft.PowerShell          None

PS > Connect-PSSession $session

Id Name            ComputerName    State         ConfigurationName     Availability
— —-            ————    ——         ——————     ————
2 Session1        localhost       Opened        Microsoft.PowerShell   RemoteDebug

PS > Receive-PSSession $session
WARNING: The remote session command is currently stopped in the debugger.  Use the Enter-PSSession cmdlet to connect
interactively to the remote session and automatically enter into the console debugger.

PS > Enter-PSSession $session
WARNING: You have entered a session that is currently stopped at a debug breakpoint inside a running command or script.
Use the Windows PowerShell command line debugger to continue debugging.
Entering debug mode. Use h or ? for help.

Hit Line breakpoint on ‘C:\DebugTest1.ps1:5’

At C:\DebugTest1.ps1:5 char:1
+ $Count
+ ~
[localhost]: [DBG]: PS \Documents>>  continue
100

Отладка удаленных сеансов  с Invoke-Command

Windows PowerShell поддерживает запуск сценариев синхронно на удаленных машинах, используя  командлет Invoke-Command. В предыдущем разделе, привели пример об использовании Invoke-Command для установки точки останова и запуск файла сценария на удаленной машине с помощью параметра -InDisconnectedSession.  Invoke-Command немедленно отключает сессию и скрипт выполняется асинхронно в удаленном сеансе.

Затем  отлаживаем удаленный сеанс с помощью Enter-PSSession. В этом случае мы делаем то же самое за исключением мы оставим сессию подключенной во время выполнения сценария. Когда достигается точка останова ,  сеанс автоматически отключается. Затем  подключаемся к удаленной сессии снова и продолжаем отладку.

Пример 5: Отладка отключенного сеанса, часть 2

PS > $session = New-PSSession -ComputerName localhost
PS > $session

Id Name            ComputerName    State         ConfigurationName     Availability
— —-            ————    ——         ——————     ————
1 Session1        localhost       Opened        Microsoft.PowerShell     Available

PS > Invoke-Command -Session $session -ScriptBlock { Set-PSBreakpoint C:\DebugTest1.ps1 -Line 1 }

ID Script                Line Command               Variable              Action                PSComputerName
— ——                —- ——-               ———              ——                —————
0 DebugTest1.ps1           1                                                                   localhost

PS > Invoke-Command -Session $session -ScriptBlock { C:\DebugTest1.ps1 }
WARNING: Session Session1 with instance ID f22a31b0-4d45-42a9-b066-bfcd63dbeb73 on computer localhost has been
disconnected because the script running on the session has stopped at a breakpoint. Use the Enter-PSSession cmdlet on
this session to connect back to the session and begin interactive debugging.
PS > $session

Id Name            ComputerName    State         ConfigurationName     Availability
— —-            ————    ——         ——————     ————
1 Session1        localhost       Disconnected  Microsoft.PowerShell          None

PS > Enter-PSSession $session
WARNING: You have entered a session that is currently stopped at a debug breakpoint inside a running command or script.
Use the Windows PowerShell command line debugger to continue debugging.
Entering debug mode. Use h or ? for help.

Hit Line breakpoint on ‘C:\DebugTest1.ps1:1’

At C:\DebugTest1.ps1:1 char:1
+ $Title = «Debugging Test»
+ ~
[localhost]: [DBG]: PS \Documents>> stepOver
At C:\DebugTest1.ps1:2 char:1
+ $Count = 100
+ ~
[localhost]: [DBG]: PS \Documents>>

Read Full Post »

1) Какие изменения в операторе Where()?

Поведение оператора и его функционал был изменен. Collection.Where('property –match name')- выражение в формате строки "Property –CompareOperator Value" не поддерживается,но поддерживается в формате scriptblock.

Формат оператора –  Collection. «Where({ expression } [, mode [, numberToReturn]])»

Тип аргументов:

Mode принимает значения:

PS > [Enum]::GetNames([System.Management.Automation.WhereOperatorSelectionMode])

Default

First

Last

SkipUntil

Until

Split

numberToReturn принимает значения:

0..2147483647([int]::MaxValue)

Примеры:

1) Получим из коллекции только нечетные числа

PS >  (1,2,3,4,5,6,7,8,9,10).where({$_%2})
1
3
5
7
9

2) Получим из коллекции только нечетные числа с добавлением mode Default

PS > (1,2,3,4,5,6,7,8,9,10).where({$_%2},»Default»)
1
3
5
7
9

3) Получим из коллекции только нечетные числа с добавлением mode Default и количеством возвращаемых значений

PS > (1,2,3,4,5,6,7,8,9,10).where({$_%2},»Default»,1)
1

4) Получим из коллекции только нечетные числа с добавлением mode Default и количеством возвращаемых значений

PS > (1,2,3,4,5,6,7,8,9,10).where({$_%2},»Default»,1)
1
3

5) Получим из коллекции только нечетные числа с добавлением mode First и количеством возвращаемых значений от начала коллекции

PS > (1,2,3,4,5,6,7,8,9,10).where({$_%2},»First»)
1

6) Получим из коллекции только нечетные числа с добавлением mode First и количеством возвращаемых значений от начала коллекции

PS > (1,2,3,4,5,6,7,8,9,10).where({$_%2},»First»,2)
1
3

7) Получим из коллекции только нечетные числа с добавлением mode Last и количеством возвращаемых значений с конца коллекции

PS > (1,2,3,4,5,6,7,8,9,10).where({$_%2},»Last»)
9

8) Получим из коллекции только нечетные числа с добавлением mode Last и количеством возвращаемых значений с конца коллекции

PS > (1,2,3,4,5,6,7,8,9,10).where({$_%2},»Last»,2)
7
9

9) Получим из коллекции только нечетные числа с добавлением mode Split

PS > (1,2,3,4,5,6,7,8,9,10).where({$_%2},»Split»)
1
3
5
7
9
2
4
6
8
10

# Первый элемент коллекции содержит значения удовлетворяющие  условию
PS > (1,2,3,4,5,6,7,8,9,10).where({$_%2},»Split»)[0]
1
3
5
7
9

# Второй элемент коллекции содержит значения не удовлетворяющие  условию
PS > (1,2,3,4,5,6,7,8,9,10).where({$_%2},»Split»)[1]
2
4
6
8

10) Получим из коллекции только нечетные числа с добавлением mode Split и колличеством элементов в первом элементе коллекции

PS > (1,2,3,4,5,6,7,8,9,10).where({$_%2},»Split»,3)[0]
1
3
5
PS > (1,2,3,4,5,6,7,8,9,10).where({$_%2},»Split»,3)[1]
2
4
6
7
8
9
10

11) Получим из коллекции  числа с добавлением mode SkipUntil(пропустить элементы не удовлетворяющие условию до первого элемента удовлетворяющего условия) и количество выводимых значений из коллекции

PS > (2,4,5,6,76,7,8,8,234,34234).where({$_%2},»SkipUntil»,1)
5
PS > (2,4,5,6,76,7,8,8,234,34234).where({$_%2},»SkipUntil»,5)
5
6
76
7
8

12) Получим из коллекции с добавлением mode Until(вывести элементы не удовлетворяющие условию до первого элемента удовлетворяющего условия) и количество выводимых значений не удовлетворяющих условию

PS  (2,4,5,6,76,7,8,8,234,34234).where({$_%2},»Until»,1)
2
PS > (2,4,5,6,76,7,8,8,234,34234).where({$_%2},»Until»,2)
2
4

13) Получить список файлов больше 100kb

PS >  (Get-ChildItem C:\Windows -File).Where({$_.Length -gt 100kb})

14) Получить список служб, которые зависят  от службы RpcSs(Remote Procedure Call (RPC))

PS >  (Get-Service).Where({$_.ServicesDependedOn.Name -eq «RpcSs»})

Данный метод является более производительным,для сравнения можно воспользоваться :

(Measure-Command {Get-ChildItem C:\Windows -File | Where Length -gt 100kb}).TotalSeconds

(Measure-Command {(Get-ChildItem C:\Windows -File).Where({$_.Length -gt 100kb})}).TotalSeconds

2)  Поддержка вызова метода используя динамическое имя метода

Начиная с версии PowerShell 4.0 , появилась поддержка вызова метода используя динамические имена методов. Начиная с PowerShell 2.0 появилась возможность использовать динамические  имена свойств.

Для свойств:

PS >  $serv = Get-Service -Name W32Time
PS >  $property = «Name»
PS >  $serv.$property
W32Time

Для методов:

PS >  «ToUpper»,»ToLower»,»Trim» | Foreach {» abc «.$_()}
ABC
abc
abc

PS >  $c = ‘Create’
PS >  ([wmiclass]»Win32_Process»).$c(«notepad.exe»)
__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     :
__DYNASTY        : __PARAMETERS
__RELPATH        :
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
ProcessId        : 32536
ReturnValue      : 0
PSComputerName   :

PS >  ([wmiclass]»Win32_Process»).$c(«notepad.exe»).ReturnValue
0

PS >  $go = «GetOwner»
PS >  Get-WmiObject Win32_Process | Foreach {$_.$go().User}

PS > $p = «Pow»

PS > [Math]::$p(2,4)

16

Для более версий меньше PowerShell 4.0:

# Используя PSObject.Methods[method].Invoke()

PS >  «ToUpper»,»ToLower»,»Trim» | Foreach {» abc «.PSObject.Methods[$_].Invoke()}
ABC
abc
abc

PS >  $s = «Split»
PS >  «a,b,c,d» | Foreach {$_.PSObject.Methods[$s].Invoke(«,»)}
a
b
c
d

# GetType().GetMethod(method, [type[]]@())

PS >  $tu= «ToUpper»
PS >  «».GetType().GetMethod($tu, [type[]]@()).Invoke(«Test»,$null)TEST

# $method.Invoke()

PS >  $tu= «ToUpper»

PS  >  «Test».$tu.Invoke()
TEST

PS >  $p = «Pow»
PS >  [Math]::$p.Invoke(2,4)
16

3) Фильтрация коллекции используя синтаксис метода

См. пункт 1. Для PowerShell 3.0 можно применить методику из http://www.powershellmagazine.com/2013/07/05/pstip-powershell-4-filtering-a-collection-by-using-a-method-syntax/ .

Update-TypeData  -Force -MemberType ScriptMethod -MemberName Where -TypeName System.Array -Value {
$prop, $psop, $val = [string] $args[0] -split ‘(-eq|-ne|-gt|-ge|-lt|-le|-like|-notlike|-match|-notmatch)’
$operation = @{ Prop = $prop.Trim(); Value = $val.Trim(); $psop = $true }
$this | where @operation
}

PS >  (Get-Process).where(«name -like p*»)

4) Ассинхронные workflow jobs не удаляются после указанного  периода таймаута при использовании общего параметра  PSElapsedTimeoutSec

-PSElapsedTimeoutSec <UInt32>

Данный параметр определяет,как долго будет выполняться workflow job в системе. После превышения порога таймаута(включая время в состоянии suspended) workflow job  не удаляется( удаляется в PowerShell 3.0,даже если не завершено), только завершается.   Интервал значений 1 — 4,294,967,295. Значение по умолчанию, 0(ноль) – неограниченно.

workflow LongTask {
Start-Sleep -Seconds 10
}

PS > LongTask -PSElapsedTimeoutSec 3
An elapsed time-out occurred, and the workflow was stopped.
At LongTask:2 char:2
+
    + CategoryInfo          : InvalidResult: (:) [], WorkflowApplicationTerminatedException
    + FullyQualifiedErrorId : JobStateFailed

Read Full Post »

1) Как установить  PowerShell V4?

.NET Framework 4.5 (В состав Windows 8.1 и Windows Server 2012,Windows Server 2012 R2 входит .NET Framework 4.5. Поэтому установка этого программного обеспечения в указанных операционных системах не требуется.)  должен быть установлен перед установкой Windows Management Framework 4.0 (WMF).

PowerShell является частью пакета Windows Management Framework 4.0 (WMF) и может быть скачан по следующим ссылкам:

Windows Management Framework 4.0 (WMF)  нельзя установить на  Windows 8, поэтому следует обновиться до Windows 8.1.

WMF 3.0  и Windows PowerShell 2.0 engine не требуются для установки WMF 4.0. Однако, Windows PowerShell 2.0 engine может быть установлен отдельно, используя Server Manager или Control Panel,  для тестирования сценариев,которые используют функциональность Windows PowerShell 2.0 (Powershell.exe -Version, Start-Job -PSVersion, and Register-PSSessionConfiguration –PSVersion).  При установленном WMF 3.0  и Windows PowerShell 2.0 engine , можно выбрать для запуска Windows PowerShell 2.0 или Windows PowerShell 3.0. После установки WMF 4.0,можно работать с  Windows PowerShell 2.0 или Windows PowerShell 4.0. Windows PowerShell 4.0 обратно совместим с Windows PowerShell 3.0, за исключением указанных в разделе Breaking Changes документа WINDOWS MANAGEMENT Framework 4.0 Release Notes.

Windows PowerShell V4 несовместим:

  • System Center 2012 Configuration Manager (not including SP1)
  • System Center Virtual Machine Manager 2008 R2 (including SP1)
  • Microsoft Exchange Server 2013, Microsoft Exchange Server 2010, and Microsoft Exchange Server 2007
  • Microsoft SharePoint 2013 and Microsoft SharePoint 2010
  • Windows Small Business Server 2011 Standard

Полезные ссылки по установке и запуску Windows PowerShell:

2) Какие компоненты были обновлены?

  • Windows PowerShell
  • Windows PowerShell Integrated Scripting Environment (ISE)
  • Windows PowerShell Web Services (Management OData IIS Extension)
  • Windows Remote Management (WinRM)
  • Windows Management Instrumentation (WMI)

3) Какие новые компоненты были добавлены?

  • Windows PowerShell Desired State Configuration (DSC)

4) Версионность PowerShell

Изменения:

  • Значение переменной $PSVersionTable.PSVersion  обновлено до  4.0

PS >  $PSVersionTable.PSVersion

Major  Minor  Build  Revision
——  ——  ——  ———
4      0      -1     -1

  • Изменен баннер copyright

Windows PowerShell
Copyright (C) 2013 Microsoft Corporation. All rights reserved.

  • Версия  Windows PowerShell 4.0 заменяет версию 3.0. Запросы для загрузки версии 3.0 автоматически загружают версию 4.0. Например,  Powershell.exe –Version 3.0 автоматически загружает версию 4.0
  • Session configurations  автоматически загружает версию 4.0, вместо 3.0
  • Командлеты использующие при запуске определенную версию Windows PowerShell, автоматически используют версию 4.0, если указана версия 3.0.  Такие  командлеты,как  Start-Job, Set-PSSessionConfiguration, и Register-PSSessionConfiguration с параметром -PSVersion <Version>
  • Значение ключа реестра HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine\PowerShellVersion изменно с  3.0 на 4.0

PS  >  Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name PowerShellVersion

PowerShellVersion : 4.0

  • Значение ключа реестра HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine\PSCompatibleVersion изменно с  1.0, 2.0, 3.0 на 1.0, 2.0, 3.0, 4.0

PS >  Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name PSCompatibleVersion

PSCompatibleVersion : 1.0, 2.0, 3.0, 4.0

Не измененные значения:

  • Переменная $pshome ссылается на  %windir%\system32\WindowsPowerShell\v1.0
  • Расширение скриптов Windows PowerShell имеет значение  .ps1
  • Значение ключей реестра Windows PowerShell расположены по адресу  HKLM:\SOFTWARE\Microsoft\PowerShell\1 и HKLM:\SOFTWARE\Microsoft\PowerShell\3

5)  Execution Policy по умолчанию в Windows Server 2012 R2?

Значение Execution Policy по умолчанию в Windows Server 2012 R2 установлено в RemoteSigned. Execution Policy для Windows 8.1 по умолчанию Restricted.

6) Новый параметр –IncludeUserName типа switch у командлета Get-Process

Данный параметр позволяет получить список пользователей от которых запущен процесс. Данный параметр требует запускать с повышенными привилегиями.

PS >  Get-Process -IncludeUserName
Get-Process : The ‘IncludeUserName’ parameter requires elevated user rights. Try running the command again in a session that has been opened with elevated user rights (that is, Run as Administrator).

Пример:

PS >  Get-Process -IncludeUserName | Where UserName -match System | Format-Table Name,UserName

Name          UserName
—-          ———
armsvc    NT AUTHORITY\SYSTEM
csrss         NT AUTHORITY\SYSTEM
csrss         NT AUTHORITY\SYSTEM

Для более ранних версий Windows PowerShell:

7) Новый командлет(функция) Get-FileHash

PS  >  (Get-Command Get-FileHash).CommandType
Function

Посмотреть код функции: — ${function:Get-FileHash}

Используя командлет Get-Member или исходный код функции,можно увидеть,что функция имеет тип retVal.psobject.TypeNames.Insert(0, «Microsoft.Powershell.Utility.FileHash»).

Также можно посмотреть,какое форматирование использует данная функция.

PS >  (Get-FormatData Microsoft.Powershell.Utility.FileHash).FormatViewDefinition.Control

Name                                                        Control
—-                                                        ——-
Microsoft.Powershell.Utility.FileHash                       TableControl

Далее можно посмотреть столбцы по умолчанию:

PS >  (Get-FormatData Microsoft.Powershell.Utility.FileHash).FormatViewDefinition.Control.Rows.Columns

Alignment DisplayEntry
——— ————
Undefined Algorithm
Undefined Hash
Undefined Path

Параметр Algorithm поддерживает следующие параметры:

PS >  (Get-Command Get-FileHash).Parameters[«Algorithm»].Attributes.ValidValues
SHA1
SHA256
SHA384
SHA512
MACTripleDES
MD5
RIPEMD160

Примеры:

PS >  Get-FileHash $pshome\powershell.exe | Format-List

Algorithm : SHA256
Hash      : E9FA973EB5AD446E0BE31C7B8AE02D48281319E7F492E1DDAADDDFBDD5B480C7
Path      : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

PS >  Get-FileHash $pshome\powershell.exe -Algorithm Sha1| Format-List

Algorithm : SHA1
Hash      : 10A3671C0FBC2BCE14FC94891E87E2F4BA07E0DF
Path      : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

Для более ранних версий Windows PowerShell:

  • Модуль PSCX и командлет Get-Hash
  • Скрипт на .Net под авторством Boe Prox — Get Hashes of Files
  • Скрипт на .Net под авторством Lee Holmes — Get-FileHash.ps1

8) Переименовали параметр Workgroup у командлета Remove-Computer

В PowerShell 3.0  командлету Remove-Computer добавили параметр Workgroup(позволяет указать имя рабочей группы,после отсоединения компьютера из домена). В PowerShell 4.0 переименовали данный параметр с Workgroup на WorkgroupName  ,теперь оба командлета Add-Computer и Remove-Computer используют единый параметр –WorkgroupName.

9) Новый параметр FullyQualifiedName у командлета Get-Module

В PowerShell 4.0 командлету Get-Module добавили новый параметр типа ModuleSpecification[].

Формат параметра  —  @{ModuleName = «modulename»; ModuleVersion = «version_number»;GUID=»guid»}.  ModuleName и ModuleVersion(желательно придерживаться формата n.n.n.n) – обязательные.

Пример:

PS >  Get-Module -FullyQualifiedName @{ModuleName=»AppLocker»;ModuleVersion=»1.0.0.0″} –ListAvailable

PS >  Get-Module -Name AppLocker -ListAvailable | Format-Table Name,Version,GUID -AutoSize

Name      Version Guid
—-      ——- —-
AppLocker 1.1.0.0 27807c40-84db-4998-ae01-11319de093ea
AppLocker 1.0.0.0 9dafd409-67de-4108-8ee9-73cd61f5b7bf

PS >  Get-Module -FullyQualifiedName @{ModuleName=»AppLocker»;ModuleVersion=»1.0.0.0″;GUID=»27807c40-84db-4998-ae01-11319de093ea»} –ListAvailable

10) Новый параметр PassThru у командлетов Enable-JobTrigger и Disable-JobTrigger

Параметр Passthru отображает все объекты, созданные или измененные с помощью командлета.

Пример:

PS >  Get-ScheduledJob | Get-JobTrigger

Id         Frequency       Time                   DaysOfWeek              Enabled
—         ———       —-                   ———-              ——-
1          Weekly          11.11.2013 23:00:00    {Monday, Wednesday, … True

PS >  Get-ScheduledJob | Get-JobTrigger | Disable-JobTrigger -PassThru

Id         Frequency       Time                   DaysOfWeek              Enabled
—         ———       —-                   ———-              ——-
1          Weekly          11.11.2013 23:00:00    {Monday, Wednesday, … False

11) Новый параметр RepeatIndefinitely у командлетов New-JobTrigger и Set-JobTrigger

Параметр RepeatIndefinitely позволяет избавиться от использования конструкции вида -RepetitionDuration ([TimeSpan]::MaxValue), которая служит для неоднократного запуска запланированного задания на неопределенный срок.

Пример:

PS >  New-JobTrigger -Once -At «1/11/2013» -RepetitionInterval (New-TimeSpan -Hour 2) -RepetitionDuration ([TimeSpan]::MaxValue)

Теперь команду можно записать:

PS >  New-JobTrigger -Once -At «1/11/2013» -RepetitionInterval (New-TimeSpan -Hour 2) -RepeatIndefinitely

Команда создает job trigger ,который запускает раз в 2 часа на неопределенный срок. Старт задачи 1/11/2013 – 0:00:00.

12) Новый параметр RunNow у командлетов Register-ScheduledJob и Set-ScheduledJob

Параметр RunNow позволяет не указывать параметр trigger для job для немедленного  выполнения задачи без указания даты и времени.

Пример:

PS >  Register-ScheduledJob -Name Test-FileName -FilePath C:\Scripts\TestFile.ps1 –RunNow

13) Изменения в командлете Save-Help?

Командлет Save-Help теперь позволяет сохранить справку для модулей(modules), которые установленные на удаленных компьютерах. В PowerShell 3.0 командлет Save-Help позволял работать только с локальным компьютером. Хотя есть возможность экспортировать модуль с удаленного компьютера,используя Windows PowerShell remoting и получить ссылку на объект PSModuleInfo, свойство HelpInfoUri не сохраняется. В PowerShell 4.0 свойство HelpInfoUri сохраняется, что позволяет Save-Help работать с удаленными модулями. Также возможно сохранить объект PSModuleInfo на диск или внешний накопитель используя командлет Export-CliXml  на компьютере без доступа к интернету, импортировать объект на компьютере с интернетом и запустить Save-Help на десериализованном объектее PSModuleInfo. Сохраненный файлы помощи можно перенести на исходный компьютер и обновить справку с помощью командлета Update-Help.

Пример:

Example 1: Run Save-Help to save the help for the DhcpServer module from an Internet-connected client computer, without installing the DhcpServer module or DHCP Server role on the local computer.

# Option 1: Run Invoke-Command to get the remote module and call Save-Help

$m = Invoke-Command -ComputerName RemoteServer -ScriptBlock { Get‑Module ‑Name DhcpServer -ListAvailable }

Save-Help -Module $m -DestinationPath C:\SavedHelp

# Option 2: Use a PSSession to get the remote module and call Save-Help

$s = New-PSSession -ComputerName RemoteServer

$m = Get-Module -PSSession $s -Name DhcpServer -ListAvailable

Save-Help -Module $m -DestinationPath C:\SavedHelp

# Option 3: Use a CimSession to get the remote module and call Save-Help

$c = New-CimSession -ComputerName RemoteServer

$m = Get-Module -CimSession $c -Name DhcpServer -ListAvailable

Save-Help -Module $m -DestinationPath C:\SavedHelp

Example 2: Install help for the DhcpServer module on a computer without any network access.

# Run Export-CliXml to serialize the PSModuleInfo object to disk or removable media

$m = Get-Module -Name DhcpServer –ListAvailable

Export-CliXml –Path E:\UsbFlashDrive\DhcpModule.xml –InputObject $m

# Transport the removable media to a computer with Internet access and import with Import-CliXml

$deserialized_m = Import-CliXml E:\UsbFlashDrive\DhcpModule.xml

Save-Help -Module $deserialized_m -DestinationPath E:\UsbFlashDrive\SavedHelp

# Transport the removable media back to the computer without network access and install the help

Update-Help –Module DhcpServer –SourcePath E:\UsbFlashDrive\SavedHelp

Read Full Post »