Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Krátký popis
Popisuje, jak spustit úlohy na pozadí na vzdálených počítačích.
Dlouhý popis
PowerShell souběžně spouští příkazy a skripty prostřednictvím úloh. PowerShell poskytuje tři typy úloh, které podporují souběžnost.
-
RemoteJob– Příkazy a skripty se spouštějí ve vzdálené relaci. -
BackgroundJob– Příkazy a skripty se spouští v samostatném procesu na místním počítači. Další informace najdete v tématu Informace o úlohách. -
PSTaskJobneboThreadJob– Příkazy a skripty se spouští v samostatném vlákně v rámci stejného procesu na místním počítači. Další informace najdete v tématu about_Thread_Jobs.
Vzdálené spouštění skriptů na samostatném počítači nebo v samostatném procesu poskytuje skvělou izolaci. Všechny chyby, ke kterým dochází ve vzdálené úloze, nemají vliv na jiné spuštěné úlohy nebo nadřazenou relaci, která úlohu spustila. Vrstva vzdálené komunikace ale přidává režii, včetně serializace objektů. Všechny objekty jsou serializovány a deserializovány, protože se předávají mezi nadřazenou relací a vzdálenou relací (úloha). Serializace velkých složitých datových objektů může spotřebovávat velké objemy výpočetních a paměťových prostředků a přenášet velké objemy dat v síti.
Důležité
Nadřazená relace, která vytvořila úlohu, také monitoruje stav úlohy a shromažďuje data kanálu. Podřízený proces úlohy se ukončí nadřazeným procesem, jakmile úloha dosáhne stavu dokončení. Pokud je nadřazená relace ukončena, všechny spuštěné podřízené úlohy se ukončí spolu s podřízenými procesy.
Tato situace se dá obejít dvěma způsoby:
- Slouží
Invoke-Commandk vytváření úloh spuštěných v odpojených relacích. Projděte si část Odpojené procesy tohoto článku. - Slouží
Start-Processk vytvoření nového procesu místo úlohy. Další informace naleznete v tématu Start-Process.
Vzdálené úlohy
Úlohy můžete spouštět na vzdálených počítačích pomocí tří různých metod.
Spusťte interaktivní relaci na vzdáleném počítači. Pak spusťte úlohu v interaktivní relaci. Postupy jsou stejné jako spuštění místní úlohy, i když všechny akce se provádějí ve vzdáleném počítači.
Spusťte úlohu ve vzdáleném počítači, která vrátí výsledky do místního počítače. Tuto metodu použijte, pokud chcete shromáždit výsledky úloh a udržovat je v centrálním umístění na místním počítači.
Spusťte úlohu na vzdáleném počítači, který udržuje výsledky na vzdáleném počítači. Tuto metodu použijte, pokud jsou data úlohy bezpečněji udržována na původním počítači.
Spuštění úlohy v interaktivní relaci
Interaktivní relaci můžete spustit se vzdáleným počítačem a pak spustit úlohu během interaktivní relace. Další informace o interaktivníchrelacích about_Remote
Postup spuštění úlohy v interaktivní relaci je téměř stejný jako postup spuštění úlohy na pozadí na místním počítači. Všechny operace však probíhají ve vzdáleném počítači, nikoli na místním počítači.
Pomocí rutiny
Enter-PSSessionspusťte interaktivní relaci se vzdáleným počítačem. Parametr ComputerNameEnter-PSSessionmůžete použít k vytvoření dočasného připojení pro interaktivní relaci. Nebo můžete použít parametr Relace ke spuštění interaktivní relace v relaci PowerShellu (PSSession).Následující příkaz spustí interaktivní relaci na počítači Server01.
C:\PS> Enter-PSSession -ComputerName Server01Příkazový řádek se změní, aby se zobrazilo, že jste nyní připojeni k počítači Server01.
Server01\C:>Pokud chcete spustit vzdálenou úlohu v relaci, použijte rutinu
Start-Job. Následující příkaz spustí vzdálenou úlohu, která získá události v protokolu událostí Windows PowerShellu na počítači se serverem Server01. RutinaStart-Jobvrátí objekt, který představuje úlohu.Tento příkaz uloží objekt úlohy do
$jobproměnné.Server01\C:> $job = Start-Job -ScriptBlock { Get-EventLog "Windows PowerShell" }I když se úloha spustí, můžete pomocí interaktivní relace spustit další příkazy, včetně jiných úloh. Interaktivní relaci však musíte nechat otevřenou, dokud se úloha nedokončí. Pokud relaci ukončíte, úloha se přeruší a výsledky se ztratí.
Pokud chcete zjistit, jestli je úloha dokončená, zobrazte hodnotu
$jobproměnné nebo pomocí rutinyGet-Jobúlohu získejte. Následující příkaz pomocí rutinyGet-Jobzobrazí úlohu.Server01\C:> Get-Job $job SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Complete True localhost Get-EventLog "Windows...Výstup
Get-Jobukazuje, že úloha běží na počítači localhost, protože úloha byla spuštěna a běží na stejném počítači (v tomto případě Server01).Pokud chcete získat výsledky úlohy, použijte rutinu
Receive-Job. Výsledky můžete zobrazit v interaktivní relaci nebo je uložit do souboru na vzdáleném počítači. Následující příkaz získá výsledky úlohy v proměnné $job. Příkaz pomocí operátoru přesměrování (>) uloží výsledky úlohy do souboru PsLog.txt na počítači se serverem Server01.Server01\C:> Receive-Job $job > C:\logs\PsLog.txtK ukončení interaktivní relace použijte rutinu
Exit-PSSession. Příkazový řádek se změní, aby se zobrazilo, že jste zpět v původní relaci na místním počítači.Server01\C:> Exit-PSSession C:\PS>Pokud chcete kdykoli zobrazit obsah
PsLog.txtsouboru na počítači Server01, spusťte jinou interaktivní relaci nebo spusťte vzdálený příkaz. Tento typ příkazu je nejlepší spustit v psSession (trvalé připojení) v případě, že chcete použít několik příkazů k prozkoumání a správě dat vPsLog.txtsouboru. Další informace o psSessions naleznete v tématu about_PSSessions.Následující příkazy používají rutinu
New-PSSessionk vytvoření psSession , která je připojena k počítači Server01, a pomocíInvoke-Commandtéto rutiny spustíGet-Contentpříkaz v PSSession k zobrazení obsahu souboru.$s = New-PSSession -ComputerName Server01 Invoke-Command -Session $s -ScriptBlock { Get-Content C:\logs\pslog.txt}
Spusťte vzdálenou úlohu, která vrátí výsledky do místního počítače (AsJob).
Pokud chcete spustit úlohu na vzdáleném počítači, který vrací výsledky příkazu do místního počítače, použijte parametr AsJob rutiny, jako je například rutina Invoke-Command .
Pokud použijete parametr AsJob , objekt úlohy se ve skutečnosti vytvoří v místním počítači, i když úloha běží na vzdáleném počítači. Po dokončení úlohy se výsledky vrátí do místního počítače.
Pomocí rutin, které obsahují podstatné jméno úlohy (rutiny úlohy), můžete spravovat jakoukoli úlohu vytvořenou libovolnou rutinou. Mnoho rutin, které mají parametry AsJob , nepoužívají vzdálené komunikace PowerShellu, takže je můžete použít i na počítačích, které nejsou nakonfigurovány pro vzdálené komunikace a které nesplňují požadavky pro vzdálené komunikace.
Následující příkaz používá ke spuštění úlohy na počítači Server01. Úloha spustí
Get-Eventlogpříkaz, který získá události v systémovém protokolu. Pomocí parametru JobName můžete k úloze přiřadit zobrazovaný název.Invoke-Command -ComputerName Server01 -ScriptBlock { Get-EventLog System} -AsJobVýsledky příkazu se podobají následujícímu ukázkovém výstupu.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Running True Server01 Get-EventLog SystemPokud se použije parametr AsJob,
Invoke-Commandvrátí stejný typ objektu úlohy, kterýStart-Jobvrací. Objekt úlohy můžete uložit do proměnné nebo můžete k získání úlohy použítGet-Jobpříkaz.Všimněte si, že hodnota vlastnosti Location ukazuje, že úloha běžela na počítači Server01.
Pokud chcete spravovat úlohu spuštěnou pomocí parametru AsJob rutiny
Invoke-Command, použijte rutiny Úlohy. Vzhledem k tomu, že objekt úlohy, který představuje vzdálenou úlohu, je v místním počítači, nemusíte ke správě úlohy spouštět vzdálené příkazy.Pokud chcete zjistit, jestli je úloha dokončená, použijte
Get-Jobpříkaz. Následující příkaz získá všechny úlohy, které byly spuštěny v aktuální relaci.Get-JobVzhledem k tomu, že vzdálená úloha byla spuštěna v aktuální relaci, místní
Get-Jobpříkaz získá úlohu. Vlastnost State objektu úlohy ukazuje, že příkaz byl úspěšně dokončen.SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Completed True Server01 Get-EventLog SystemPokud chcete získat výsledky úlohy, použijte rutinu
Receive-Job. Vzhledem k tomu, že výsledky úlohy se automaticky vrátí do počítače, kde se nachází objekt úlohy, můžete výsledky získat pomocí místníhoReceive-Jobpříkazu.Následující příkaz pomocí rutiny
Receive-Jobzíská výsledky úlohy. K identifikaci úlohy používá ID relace. Tento příkaz uloží výsledky úlohy do proměnné $results. Výsledky můžete také přesměrovat do souboru.$results = Receive-Job -Id 1
Spusťte vzdálenou úlohu, která uchovává výsledky ve vzdáleném počítači.
Pokud chcete spustit úlohu na vzdáleném počítači, který uchovává výsledky příkazů na vzdáleném počítači, použijte Invoke-Command rutinu Start-Job ke spuštění příkazu na vzdáleném počítači. Tuto metodu můžete použít ke spouštění úloh na více počítačích.
Když spustíte Start-Job příkaz vzdáleně, objekt úlohy se vytvoří ve vzdáleném počítači a výsledky úlohy se zachovají ve vzdáleném počítači.
Z hlediska úlohy jsou všechny operace místní. Právě spouštíte příkazy vzdáleně ke správě místní úlohy na vzdáleném počítači.
Pomocí rutiny
Invoke-CommandspusťteStart-Jobpříkaz na vzdáleném počítači.Tento příkaz vyžaduje psSession (trvalé připojení). Pokud k vytvoření dočasného
Invoke-Commandpřipojení použijete parametr ComputerName,Invoke-Commandje příkaz po vrácení objektu úlohy považován za dokončený. V důsledku toho se dočasné připojení zavře a úloha se zruší.Následující příkaz pomocí rutiny
New-PSSessionvytvoří psSession, která je připojena k počítači Server01. Příkaz uloží psSession do$sproměnné.$s = New-PSSession -ComputerName Server01Následující příkaz použije rutinu
Invoke-CommandStart-Jobke spuštění příkazu v psSession. PříkazStart-JobaGet-Eventlogpříkaz jsou uzavřeny ve složených závorkách.Invoke-Command -Session $s -ScriptBlock { Start-Job -ScriptBlock {Get-EventLog System}}Výsledky se podobají následujícímu ukázkovém výstupu.
Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 2 Job2 Running True Localhost Get-EventLog SystemPři vzdáleném
Start-JobInvoke-Commandspuštění příkazu vrátí stejný typ objektu úlohy, kterýStart-Jobvrací. Objekt úlohy můžete uložit do proměnné nebo můžete k získání úlohy použítGet-Jobpříkaz.Všimněte si, že hodnota vlastnosti Location ukazuje, že úloha běžela na místním počítači, označované jako LocalHost, i když úloha běžela na počítači Server01. Vzhledem k tomu, že objekt úlohy je vytvořen na počítači Server01 a úloha běží na stejném počítači, je považována za místní úlohu na pozadí.
Ke správě vzdálené úlohy použijte rutiny Úlohy . Vzhledem k tomu, že objekt úlohy je ve vzdáleném počítači, musíte spustit vzdálené příkazy, abyste získali, zastavili, čekali nebo načetli výsledky úlohy.
Pokud chcete zjistit, jestli je úloha dokončená, spusťte
Invoke-CommandpříkazGet-Jobv nástroji PSSession, který je připojený k počítači Server01.Invoke-Command -Session $s -ScriptBlock {Get-Job}Příkaz vrátí objekt úlohy. Vlastnost State objektu úlohy ukazuje, že příkaz byl úspěšně dokončen.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 2 Job2 Completed True LocalHost Get-EventLog SystemPokud chcete získat výsledky úlohy, použijte
Invoke-CommandrutinuReceive-Jobke spuštění příkazu v nástroji PSSession, který je připojený k počítači Server01.Následující příkaz pomocí rutiny
Receive-Jobzíská výsledky úlohy. K identifikaci úlohy používá ID relace. Tento příkaz uloží výsledky úlohy do$resultsproměnné. Pomocí parametruReceive-JobKeep zachová výsledek v mezipaměti úlohy ve vzdáleném počítači.$results = Invoke-Command -Session $s -ScriptBlock { Receive-Job -SessionId 2 -Keep }Výsledky můžete také přesměrovat na soubor v místním nebo vzdáleném počítači. Následující příkaz používá operátor přesměrování k uložení výsledků do souboru na počítači Server01.
Invoke-Command -Session $s -Command { Receive-Job -SessionId 2 > C:\logs\pslog.txt }
Jak spustit jako odpojený proces
Jak jsme už zmínili, když je nadřazená relace ukončena, všechny spuštěné podřízené úlohy se ukončí spolu s podřízenými procesy. Pomocí vzdálené komunikace na místním počítači můžete spouštět úlohy, které nejsou připojené k aktuální relaci PowerShellu.
Na místním počítači vytvořte novou relaci PowerShellu. Slouží Invoke-Command ke spuštění úlohy v této relaci.
Invoke-Command umožňuje odpojit vzdálenou relaci a ukončit nadřazenou relaci. Později můžete spustit novou relaci PowerShellu a připojit se k dříve odpojené relaci a pokračovat v monitorování úlohy. Při ukončení této relace se však všechna data vrácená do původní relace PowerShellu ztratí. Po opětovném připojení se vrátí pouze nové datové objekty vygenerované po odpojení.
# Create remote session on local machine
PS> $session = New-PSSession -Cn localhost
# Start remote job
PS> $job = Invoke-Command -Session $session -ScriptBlock { 1..60 | % { sleep 1; "Output $_" } } -AsJob
PS> $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Running True localhost 1..60 | % { sleep 1; ...
# Disconnect the job session
PS> Disconnect-PSSession $session
Id Name Transport ComputerName ComputerType State ConfigurationName Availability
-- ---- --------- ------------ ------------ ----- ----------------- ------------
1 Runspace1 WSMan localhost RemoteMachine Disconnected Microsoft.PowerShell None
PS> $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Disconnected True localhost 1..60 | % { sleep 1;
# Reconnect the session to a new job object
PS> $jobNew = Receive-PSSession -Session $session -OutTarget Job
PS> $job | Wait-Job | Receive-Job
Output 9
Output 10
Output 11
...
V tomto příkladu jsou úlohy stále připojené k nadřazené relaci PowerShellu.
Nadřazená relace ale není původní relací PowerShellu, ve které Invoke-Command byla spuštěna.