Interactive vs. Background • При выполнении некоторых длительных команд в оболочке, вы можете предпочесть, чтобы они происходили в фоновом режиме, так что вы могли бы продолжать использовать оболочку для других задач. • Одним из способов достижения этой цели могло бы быть простое открытие второго окна оболочки, но это связано с использованием немного большего объема памяти и процессорного времени на вашем компьютере, и дает вам еще одно окно в управлении. Другим вариантом является выполнение команд в качестве фонового задания. Фоновый WMI • Командлет Get-WmiObject… часто занимает много времени для запуска, особенно, когда вы извлекаете информацию из нескольких удаленных компьютеров. поддерживает -AsJob параметр, который приводит к выполнению его в фоновом режиме. Get-WmiObject –computer (gc names.txt) –class CIM_DataFile –AsJob Управление заданиями • Четыре важных командлета для управления задагиями Get-Job Remove-Job Wait-Job Stop-Job Job Output Когда работа завершена, выводы ее команды будут сохраняться в памяти как часть рабочего объекта. Вы можете использовать Receive-Job для получения этих результатов с кэш-памяти. Receive-Job помещает объекты в конвейер. Предположим, вы начинаете работу с помощью следующей команды: Receive-Job –id 2 | Sort State | Where { $_.State –ne "Stopped" } • Вы также можете присвоить результаты Receive-Job переменной . $results = Receive-Job –id 2 • Когда вы получаете итог работы, оболочка удаляет итог из кэш- памяти задания. • Указывая параметр сохранения, однако, вы можете поручить оболочке оттавить результаты в кэше задания используя параметр keep Commands as Jobs • Фоновые задания не ограничиваются WMI. Другие командлеты поддерживают параметр AsJob, и вы можете использовать любые из этих команд, чтобы начать новую фоновую работу • любая команда может стать фоновой работой с помощью Start-Job командлета. ls Start-Job -scriptblock {Get-Process} Удаленное исполнение • Существует несколько форм удаленного исполнения: командлеты, которые имеют computerName parameter и не используют Windows PowerShell Remoting . Некоторые командлеты предназначены созданы для связи с удаленным компьютером. Active Directory командлеты, например . Windows PowerShell Remoting способен делать удаленное подключение к одному или нескольким компьютерам и запускать команды, которые находятся на этих компьютерах . Windows PowerShell Remoting • 1-to-1 Remoting: В этом случае, вы подключаетесь к одному удаленному компьютеру и запускаете команды оболочки на нем, точно так, как если бы вы зашли в консоль и открыли Windows PowerShell окно. • 1-to-Many Remoting, или Fan-Out Remoting: В этом случае, вы даете команду, которая будет выполнена на одном или нескольких удаленных компьютерах одновременно. Вы не работаете с каждым удаленным компьютером интерактивно, а, скорее, ваши команды выдаются и выполняются в пакетном режиме, и результаты возвращаются на компьютер для вашего пользования. • Many-to-1 Remoting или Fan-In Remoting: Этот сценарий предполагает, что несколько администраторов осуществляют удаленное подключение к одному компьютеру. Как правило, эти администраторы будут иметь различные разрешения на удаленном компьютере и могут работать в ограниченном пространстве внутри оболочки. 1-to-1 Shell • 1-to-1 shell позволяет быстро получить удаленную командную строку Аналогично Telnet, SSH, или PSExec \\computerName cmd Enter-PSSession –comp server-r2 • Для выхода используйте Exit-PSSession 1-to-Many Remoting 1-to-1 Remoting полезен, когда вам нужно всего лишь выполнить команды на удаленном компьютере. Тем не менее, если вам нужно выполнить те же команды на нескольких удаленных компьютерах с помощью 1-to-1 Invoke-Command исполняются синхронно Invoke-Command –scriptblock { Dir c:\demo } –computerName Server1,Server2,Server3 Pipeline Binding • Recall that some cmdlets bind their pipeline input ByPropertyName. This means that property names must match. Problem: The –computerName parameter of Invoke-Command binds ByPropertyName, but some cmdlets produce objects that use the Name property instead. Solution: Create custom objects to change the property name. Get-ADComputer –filter * | Select @{Label='ComputerName';Expression={$_.Name}} | Get-Service –name * Работа с результатами • Имейте в виду, что Windows PowerShell командлеты возвращают объекты, как их выводы. К сожалению, объекты программного обеспечения не могут быть переданы по сети. Вместо этого, WinRM сериализирует объекты в XML-формате, так как XML это просто текст, и текст может быть передан по сети довольно легко. Объекты принимаются на компьютере, а затем десериализируются обратно в объекты. Такое преобразование в и из XML отражается на том, как вы можете использовать объекты Invoke-Command –script { Get-Service } –computer Server1,Server2 | Sort PSComputerName | FormatTable –groupby PSComputerName Многокомпьютерные задания • Задания, выполняемые на нескольких удаленных компьютерах сожержат дочерние задания Задания верхнего уровня представляют задание в целом Дочерние задания представляют задачи на каждом конкретном компьютере • Чтобы посмотреть имена дочерних заданий… Get-Job -id 1 | Select childjobs • Получить их… Get-Job -name job2 • Получить их результаты… Receive-Job –name Job2 –keep Распределение нагрузки • Избегайте… Invoke-Command –script { Get-Service } –computer Server1 | Where { $_.Status –eq "Running"} | Sort Name | Export-CSV c:\services.csv • Делайте так… Invoke-Command –script { Get-Service | Where { $_.Status –eq "Running" } | Sort Name } | Export-CSV c:\services.csv