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 переменной. Когда вы получаете итог работы, оболочка удаляет итог из кэш- памяти задания. Указывая параметр сохранения, однако, вы можете поручить оболочке оттавить результаты в кэше задания используя параметр - keep Receive-Job –id 2 | Sort State | Where { $_.State –ne "Stopped" } $results = Receive-Job –id 2
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 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 * | | Get-Service –name * Get-ADComputer –filter * | | Get-Service –name *
Работа с результатами Имейте в виду, что Windows PowerShell командлеты возвращают объекты, как их выводы. К сожалению, объекты программного обеспечения не могут быть переданы по сети. Вместо этого, WinRM сериализирует объекты в XML-формате, так как XML это просто текст, и текст может быть передан по сети довольно легко. Объекты принимаются на компьютере, а затем десериализируются обратно в объекты. Такое преобразование в и из XML отражается на том, как вы можете использовать объекты Invoke-Command –script { Get-Service } –computer Server1,Server2 | Sort PSComputerName | Format- Table –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 } –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 Invoke-Command –script { Get-Service | Where { $_.Status –eq "Running" } | Sort Name } | Export-CSV c:\services.csv