Megosztás a következőn keresztül:


Folyamatok kezelése folyamatparancsmagokkal

Ez a minta csak a Windows PowerShell 5.1-et érinti.

A PowerShell Folyamat parancsmagjaival helyi és távoli folyamatokat kezelhet a PowerShellben.

Folyamatok lekérése

A helyi számítógépen futó folyamatok futtatásához futtasson egy Get-Process paraméterek nélkül.

Az egyes folyamatokat a folyamatnevek vagy a folyamatazonosítók megadásával szerezheti be. A következő parancs lekéri az Idling folyamatot.

Get-Process -Id 0
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
      0       0        0         16     0               0 Idle

Bár bizonyos helyzetekben a parancsmagok nem adnak vissza adatokat, amikor egy folyamatot a ProcessId-el ad meg, a Get-Process hibaüzenetet ad, ha nem talál egyezést, mert általában egy ismert futó folyamat lekérése a cél. Ha nincs folyamat ezzel az azonosítóval, valószínű, hogy az azonosító helytelen, vagy hogy az érdeklődésre számot tartó folyamat már véget ért.

Get-Process -Id 99
Get-Process : No process with process ID 99 was found.
At line:1 char:12
+ Get-Process  <<<< -Id 99

A Get-Process parancsmag Név paraméterével megadhatja a folyamatok egy részhalmazát a folyamat neve alapján. A Név paraméter több nevet is felvehet egy vesszővel tagolt listában, és támogatja a helyettesítő karakterek használatát, így beírhatja a névmintákat.

A következő parancs például olyan folyamatot kap, amelynek a neve "ex" betűvel kezdődik.

Get-Process -Name ex*
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    234       7     5572      12484   134     2.98   1684 EXCEL
    555      15    34500      12384   134   105.25    728 explorer

Mivel a .NET System.Diagnostics.Process osztály a PowerShell-folyamatok alapja, az System.Diagnostics.Processáltal használt konvenciók némelyikét követi. Ezen konvenciók egyike, hogy a végrehajtható fájlok folyamatának neve soha nem tartalmazza a végrehajtható név végén található .exe.

Get-Process a Név paraméterhez több értéket is elfogad.

Get-Process -Name exp*,power*
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    540      15    35172      48148   141    88.44    408 explorer
    605       9    30668      29800   155     7.11   3052 powershell

A Get-Process ComputerName paraméterével lekérheti a folyamatokat a távoli számítógépeken. Az alábbi parancs például lekéri a PowerShell-folyamatokat a helyi számítógépen (amelyet a "localhost" képvisel) és két távoli számítógépen.

Get-Process -Name powershell -ComputerName localhost, Server01, Server02
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    258       8    29772      38636   130            3700 powershell
    398      24    75988      76800   572            5816 powershell
    605       9    30668      29800   155     7.11   3052 powershell

A számítógépnevek ebben a megjelenítésben nem egyértelműek, de a Get-Process visszaadott folyamatobjektumok MachineName tulajdonságában vannak tárolva. Az alábbi parancs a Format-Table parancsmaggal jeleníti meg a folyamat azonosító, ProcessName és MachineName (ComputerName) tulajdonságát.

Get-Process -Name powershell -ComputerName localhost, Server01, Server01 |
    Format-Table -Property Id, ProcessName, MachineName
  Id ProcessName MachineName
  -- ----------- -----------
3700 powershell  Server01
3052 powershell  Server02
5816 powershell  localhost

Ez az összetettebb parancs hozzáadja a MachineName tulajdonságot a szabványos Get-Process megjelenítéshez.

Get-Process powershell -ComputerName localhost, Server01, Server02 |
    Format-Table -Property Handles,
        @{Label="NPM(K)";Expression={[int]($_.NPM/1024)}},
        @{Label="PM(K)";Expression={[int]($_.PM/1024)}},
        @{Label="WS(K)";Expression={[int]($_.WS/1024)}},
        @{Label="VM(M)";Expression={[int]($_.VM/1MB)}},
        @{Label="CPU(s)";Expression={if ($_.CPU -ne $()){$_.CPU.ToString("N")}}},
        Id, ProcessName, MachineName -Auto
Handles  NPM(K)  PM(K) WS(K) VM(M) CPU(s)  Id ProcessName  MachineName
-------  ------  ----- ----- ----- ------  -- -----------  -----------
    258       8  29772 38636   130         3700 powershell Server01
    398      24  75988 76800   572         5816 powershell localhost
    605       9  30668 29800   155 7.11    3052 powershell Server02

Folyamatok leállítása

A PowerShell rugalmasan listázza a folyamatokat, de mi a helyzet egy folyamat leállításával?

A Stop-Process parancsmag egy nevet vagy azonosítót használ a leállítandó folyamat megadásához. A folyamatok leállításának lehetősége az ön engedélyétől függ. Egyes folyamatok nem állíthatók le. Ha például megpróbálja leállítani a tétlen folyamatot, hibát kap.

Stop-Process -Name Idle
Stop-Process : Process 'Idle (0)' cannot be stopped due to the following error:
 Access is denied
At line:1 char:13
+ Stop-Process  <<<< -Name Idle

A Megerősítés paraméterrel is kényszerítheti a kérést. Ez a paraméter különösen akkor hasznos, ha helyettesítő karaktert használ a folyamatnév megadásakor, mert előfordulhat, hogy véletlenül megfelel bizonyos folyamatoknak, amelyeket nem szeretne leállítani:

Stop-Process -Name t*,e* -Confirm
Confirm
Are you sure you want to perform this action?
Performing operation "Stop-Process" on Target "explorer (408)".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):n
Confirm
Are you sure you want to perform this action?
Performing operation "Stop-Process" on Target "taskmgr (4072)".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):n

Összetett folyamatkezelés az objektumszűrési parancsmagok némelyikével lehetséges. Mivel egy folyamatobjektumnak van egy Válasz tulajdonsága, amely akkor igaz, ha már nem válaszol, az összes nem válaszoló alkalmazást a következő paranccsal állíthatja le:

Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process

Ezt a megközelítést más helyzetekben is használhatja. Tegyük fel például, hogy egy másodlagos értesítési terület alkalmazás automatikusan fut, amikor a felhasználók elindítanak egy másik alkalmazást. Előfordulhat, hogy ez nem működik megfelelően a Terminálszolgáltatások munkamenetekben, de továbbra is a fizikai számítógép konzolján futó munkamenetekben szeretné tartani. A fizikai számítógép asztalához csatlakoztatott munkamenetek mindig 0 munkamenet-azonosítóval rendelkeznek, így a folyamat minden más munkamenetben lévő példányát leállíthatja a Where-Object és a folyamat használatával, SessionId:

Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process

A Stop-Process parancsmag nem rendelkezik ComputerName paraméterrel. Ezért a leállítási folyamat parancs távoli számítógépen való futtatásához a Invoke-Command parancsmagot kell használnia. Ha például le szeretné állítani a PowerShell-folyamatot a Server01 távoli számítógépen, írja be a következőt:

Invoke-Command -ComputerName Server01 {Stop-Process PowerShell}

Az összes többi PowerShell-munkamenet leállítása

Időnként hasznos lehet leállítani az összes futó PowerShell-munkamenetet az aktuális munkameneten kívül. Ha egy munkamenet túl sok erőforrást használ, vagy nem érhető el (lehet, hogy távolról vagy egy másik asztali munkamenetben fut), előfordulhat, hogy nem tudja közvetlenül leállítani. Ha azonban megpróbálja leállítani az összes futó munkamenetet, előfordulhat, hogy az aktuális munkamenet leáll.

Minden PowerShell-munkamenet rendelkezik egy PID környezeti változóval, amely tartalmazza a Windows PowerShell-folyamat azonosítóját. Ellenőrizheti a $PID az egyes munkamenetek azonosítójával, és csak olyan Windows PowerShell-munkameneteket állíthat le, amelyek más azonosítóval rendelkeznek. A következő folyamatparancs ezt teszi, és visszaadja a leállított munkamenetek listáját (a PassThru paraméter használata miatt):

Get-Process -Name powershell | Where-Object -FilterScript {$_.Id -ne $PID} |
    Stop-Process -PassThru
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    334       9    23348      29136   143     1.03    388 powershell
    304       9    23152      29040   143     1.03    632 powershell
    302       9    20916      26804   143     1.03   1116 powershell
    335       9    25656      31412   143     1.09   3452 powershell
    303       9    23156      29044   143     1.05   3608 powershell
    287       9    21044      26928   143     1.02   3672 powershell

Folyamatok indítása, hibakeresése és várakozás a folyamatokra

A PowerShell emellett parancsmagokkal is rendelkezik, hogy elindítsa (vagy újraindítsa), hibakeresést végezzen egy folyamaton, és várjon, amíg a folyamat befejeződik egy parancs futtatása előtt. Ezekről a parancsmagokról további információt az egyes parancsmagok súgótémakörében talál.

Lásd még