Mindezek figyelembevételével a munkamenetekkel készíthetünk egy olyan megoldást, amellyel biztosíthatjuk, hogy egy szkriptünk egy -TimeOut paraméterhez megadható maximális ideig futhat csak. Ehhez a Wait-Job -timeout paraméterét használhatjuk fel. Íme az Invoke-Job függvény:
function Invoke-Job{
param(
[scriptblock] $ScriptBlock = {},
[int] $timeout = -1
)
$job = start-job -ScriptBlock $ScriptBlock
Wait-Job -Timeout $timeout -Job $job
Stop-Job -Job $job
Receive-Job -Job $job
Remove-Job -Job $job
}
Ezzel például a teljes C: kilistázása maximum 3 másodpercig ezt eredményezi:
PS C:\> Invoke-Job -ScriptBlock {Get-ChildItem c:\ -Recurse -ErrorAction Silent
lyContinue} -timeout 3
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d-r-- 2014.11.29. 11:43 Documents
d---- 2014.12.13. 22:38 Downloads
d---- 2014.10.28. 12:51 drivers
d---- 2014.10.28. 14:36 Intel
d---- 2014.10.28. 13:27 NVIDIA
d---- 2009.07.14. 5:20 PerfLogs
Azaz korántsem kaptuk meg az összes fájlt, de sok esetben praktikus valamilyen felső határt szabni a szkriptjeink futásának. Természetesen ezt a megoldást lehetne finomítani, például valamilyen hibát, vagy figyelmeztetést lehetne kiírni, ha a timeout miatt kellett megállítani a futtatást és nem pedig magától fejezte be a teendőjét.
Háttérfolyamatok tehát főleg olyan parancsok futtatása esetén fontosak, amelyek hosszú ideig futnak. Néhány parancs már előre tudhatóan hosszú ideig fog futni, így ezek esetében van egy ‑AsJob kapcsoló, amely a fenti külön munkamenet létrehozása nélkül már eleve háttérfolyamatként futtatja a parancsot. Keressük ki ezeket a parancsokat:
[1] PS C:\> PS C:\> Get-Help * -Parameter asjob
Name Category Synopsis
---- -------- --------
Invoke-Command Cmdlet Runs commands on local and...
Get-WmiObject Cmdlet Gets instances of Windows ...
Invoke-WmiMethod Cmdlet Calls Windows Management I...
Remove-WmiObject Cmdlet Deletes an instance of an ...
Set-WmiInstance Cmdlet Creates or updates an inst...
Test-Connection Cmdlet Sends ICMP echo request pa...
Restart-Computer Cmdlet Restarts ("reboots") the o...
Stop-Computer Cmdlet Stops (shuts down) local a...
Például a Restart-Computer biztos hosszadalmas folyamat, hiszen le kell állítani a futó folyamatokat, ami nem két pillanat. Vagy hasonlóan a Test-Connection is ilyen cmdlet, amellyel gyakorlatilag „pingetni” lehet gépeket:
PS C:\Users\TEMP> Test-Connection dc -AsJob
WARNING: column "Command" does not fit into the display and was removed.
Id Name State HasMoreData Location
-- ---- ----- ----------- --------
5 Job5 Running False .
PS C:\Users\TEMP> Receive-Job 5
WARNING: 2 columns do not fit into the display and were removed.
Source Destination IPV4Address IPV6Address
------ ----------- ----------- -----------
MEMBER dc 192.168.1.10 {}
Itt tehát a parancs maga hozta létre a munkamenetet, a lekérdezése ugyanúgy Receive-Job cmdlet segítségével történhet.
És ilyen lehet az invoke-command cmdlet is, amellyel parancsokat hajtathatunk végre akár saját gépünkön, akár más gépeken is távolról. Ez utóbbi már átvezet minket a következő témánkba, a távoli parancsfuttatás világába.