Linux Topアプリと同様の機能を提供できるPowerShellコマンドレットを探しています。特定の間隔で更新され、CPU%utilでプロセスリストを表示するもの。
CPU使用率をループでリストするスクリプトを見てきましたが、管理用のSSH / Powershellアクセスをセットアップしているので、topのようなものがはるかに便利です(私はまだパテシェルが好きです!)
Linux Topアプリと同様の機能を提供できるPowerShellコマンドレットを探しています。特定の間隔で更新され、CPU%utilでプロセスリストを表示するもの。
CPU使用率をループでリストするスクリプトを見てきましたが、管理用のSSH / Powershellアクセスをセットアップしているので、topのようなものがはるかに便利です(私はまだパテシェルが好きです!)
回答:
While(1) {ps | sort -des cpu | select -f 15 | ft -a; sleep 1; cls}
これは、ラベルを上部に保持するシンプルなライナーです。
これは、パラメータなしでテーブルをフォーマットすると、デフォルトのテーブルが描画されるだけなので、機能します。autosizeは、すべてのデータが画面に収まるように列幅を自動的に調整するために使用されます。
使用されている短縮コマンドの内訳は次のとおりです
CPU
in ps
はCPU使用率ではなく、合計使用時間の秒数です。したがって、これはあまり役に立ちません。
単一のコマンドレット形式で私が知っていることは何もありませんが、あなたが言うように、スクリプトはtopをエミュレートするために書くのは簡単です。
while (1) { ps | sort -desc cpu | select -first 30; sleep -seconds 2; cls }
他と同様のソリューションですが、Get-Processの代わりにGet-Counterを使用します。
While(1) { $p = get-counter '\Process(*)\% Processor Time'; cls; $p.CounterSamples | sort -des CookedValue | select -f 15 | ft -a}
サンプル出力:
Path InstanceName CookedValue
---- ------------ -----------
\\server_name\process(_total)\% processor time _total 4806.03969127454
\\server_name\process(idle)\% processor time idle 1103.7573538257
\\server_name\process(program#2)\% processor time program 749.692930701698
\\server_name\process(program#5)\% processor time program 563.424255927765
\\server_name\process(program#1)\% processor time program 535.714866291973
\\server_name\process(program#6)\% processor time program 455.665518455242
\\server_name\process(program#3)\% processor time program 426.416718284128
\\server_name\process(program)\% processor time program 395.628507577693
\\server_name\process(program#4)\% processor time program 335.591496700144
\\server_name\process(microsoftedgecp#2)\% processor time microsoftedgecp 129.310484967028
\\server_name\process(system)\% processor time system 80.0493478367316
\\server_name\process(chrome#8)\% processor time chrome 1.53941053532176
ここで、get-processレポートを使用して、プロセスの開始以降の合計CPU時間を報告する他のほとんどのソリューションを見つけました。それはトップの結果は常にだけだっ24/7まで滞在することを自分のサーバー上で有用ではありませんでしたsvchost
し、system
秒の何百万人で。真のtop
タスクマネージャーまたは同等のタスクマネージャーは、最近一定の期間にわたって記録されたCPU使用率のスナップショットを提供し、Get-Counterはそれを提供します。このSuperuserの投稿は、まだ「powershell top」のGoogleの最高の結果であるため、この代替案は貢献する価値があると考えました。
私のコマンドはGet-カウンタードキュメントから例13に基づいています:https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Diagnostics/Get-Counter。
ワンライナーの内訳は次のとおりです。必要に応じて簡単に変更できます。
While(1) {
ループするだけget-counter '\Process(*)\% Processor Time'
CPU%データを選択します。このコマンドは戻るのにかなりの時間がかかるようですので、sleep
cls
新しいテーブルのクリアsort -des CookedValue
CookedValueは、私たちがテストしているフィールドで、最大のものを上に並べますselect -f 15
最初に表示15ft -a
書式設定された表で表示Get-Counter
からの累積CPU時間ではなく、「即時」CPUを提供しますps
。より良いフォーマット: Get-Counter '\Process(*)\% Processor Time' | Select-Object -ExpandProperty countersamples| Select-Object -Property instancename, cookedvalue| ? {$_.instanceName -notmatch "^(idle|_total|system)$"} | Sort-Object -Property cookedvalue -Descending| Select-Object -First 25| ft InstanceName,@{L='CPU';E={($_.Cookedvalue/100/$env:NUMBER_OF_PROCESSORS).toString('P')}} -AutoSize
機能を提供するPowerShellコマンドレットを知りません。あなたが望むことを行うフリーウェアの外部コマンドがあります。SysinternalsスイートのMark Russinovichのpslistを見てください。Pslistは、実行可能なプロセスのリストを構成可能なビューで提供します。「pslist -s」は、1秒間に1回のデフォルトのリフレッシュレートで、必要な連続更新を提供します。
MarkのGUI Process Explorerを使用することを好みますが、pslistはコンソールセッションには便利です。
Sysinternalsのホームページはこちらです:http : //technet.microsoft.com/en-us/sysinternals
デニス
また、Windows用のLinuxのような環境が必要な場合は、Cygwinを使用できることを指摘しておきます。Linux環境をWindowsにもたらします。ほとんどすべてのコマンドを使用できます。ただし、これがどれほど役立つかはわかりません。
これもトリックを行う可能性があります。
function htopish {
Param (
[Parameter(Position=1)] [Alias("l")]
[int]$TotalList=24,
[Parameter(Position=2)] [Alias("r")]
[int]$Invertal=1
)
Begin {}
Process {
While ($true) {
$CounterSamples = Get-Counter '\Process(*)\ID Process','\Process(*)\% Processor Time','\Process(*)\Working Set' | Select-Object -Expand CounterSamples
Clear-Host
$CounterSamples | Group-Object { Split-Path $_.Path } | Where-Object {$_.Group[1].InstanceName -notmatch "^Idle|_Total|System$"} | Sort-Object -Property {$_.Group[1].CookedValue} -Descending | Select-Object -First $TotalList | Format-Table @{Name="ProcessId";Expression={$_.Group[0].CookedValue}},@{Name="ProcessorUsage";Expression={[System.Math]::Round($_.Group[1].CookedValue/100/$env:NUMBER_OF_PROCESSORS,4)}},@{Name="ProcessName";Expression={$_.Group[1].InstanceName}},@{Name="WorkingSet";Expression={[System.Math]::Round($_.Group[2].CookedValue/1MB,4)}}
Sleep -Seconds $Invertal
}
}
End {}
}
関数は、に依存しているGet-Counter
サンプルや意志出力ProcessId,ProcessName,ProcessorUsage
とWorkingSet
。このカウンタサンプルはさらに含むように拡張することができUser
、CommandLine
出力ではなく、私はそれを行うには、まだパフォーマンスの方法を働いていません。
マークからの次のコメントは、質問がほぼ正確に実行され、機能するため、より多くの推奨事項を取得する必要があります。
コンソール全体をクリアする必要なく、すべての更新で上部に素敵な見出しを提供します。
$saveY = [console]::CursorTop
$saveX = [console]::CursorLeft
while ($true) {
Get-Process | Sort -Descending CPU | Select -First 30;
Sleep -Seconds 2;
[console]::setcursorposition($saveX,$saveY+3)
}
(コメントへのリンク:https : //superuser.com/a/770455/989044)
シンプルなモジュールを作成してgithubでホストするか、chocoを提供する必要があります。それはグーグルで頻繁に検索されており、すべての種類の回避策がありますが、どれもそれほどエレガントではなく、Linuxのtopコマンドに近いため、そもそも標準モジュールであると思います。
このように投稿してすみませんが、ここの厳しい規則のために、50カルマほどなくしてコメントしたりメモしたりすることはできません。
cmdからtopを直接実行するには、次のコードでファイル%WINDIR%\ top.batを作成する必要があります。
@echo off && cls && @echo TOP Program initialisation. Please Wait...
powershell -ExecutionPolicy unrestricted -command "& {cls; While(1) {ps | sort -des cpu | select -f 35 | ft -a; sleep 2; cls}}"
プロセスでフィルタリングする場合は、findstrを使用します
while (1) { ps | findstr explorer | sort -desc cpu | select -first 30; sleep -seconds 2; cls }
次のコマンドを使用して、PowerShellからリソースモニターを起動できます。
PS C:\>resmon
Alt + F4でいつでもアプリケーションを閉じることができます。これにより、フォーカスがpowershellウィンドウに戻ります。
Windowsのhtop-alternativeを試すことができます-NTop
Windows用のViエミュレーションを備えたhtopのようなシステムモニター。タスクマネージャを使用するだけでは不十分だからです。
Windows NT-opまたはNukeTopと同様のNTop。あなたが好むものは何でも(明らかに後者)。
コマンドラインオプション:
- -Cモノクロカラースキームを使用します。
- -hヘルプ情報を表示します。
- -p PID、PID ...指定されたPIDのみを表示します。
- -s COLUMNこの列でソートします。
- -u USERNAMEこのユーザーに属するプロセスのみを表示します。
- -vバージョンを出力します。
対話型コマンド:
- 上矢印および下矢印、PgUpおよびPgDown、jおよびk プロセスリストをスクロールします。
- CTRL +左および右矢印 プロセスのソート列を変更します。
- g プロセスリストの一番上に移動します。
- G プロセスリストの一番下に移動します。
- 選択したプロセスにスペースタグを付けます。
- U すべてのタグ付きプロセスのタグを解除します。
- K すべてのタグ付きプロセスを強制終了します。
- ソート順を逆にします。
- F プロセスに従う:ソート順により、現在選択されているプロセスがリスト内で移動する場合、選択バーがそれに続くようにします。カーソルを手動で移動すると、この機能は自動的に無効になります。
- n 検索の次へ。
- N 前の検索。
Viコマンド:
- :exec CMD 指定されたWindowsコマンドを実行します。
- :kill PID(s) 指定されたすべてのプロセスを強制終了します。
- :q、:quit NTop を終了します。
- / PATTERN、:search PATTERN 検索を実行します。
- :sort COLUMN 指定された列の後にプロセスリストをソートします。
- :tree プロセスツリーを表示します。
環境変数mytop.ps1
にあるフォルダーで呼び出されるファイルに以下を保存しPATH
ます。次に、PowerShellコンソールから次のいずれかを使用します。
mytop
-「メモリ」列によるデフォルトのソートを使用して、最初の30行を表示します。mytop CPU 50
-「CPU」列でソートし、最初の50行を表示します。While(1) {$p = myTop Memory 50; cls; $p}
-1秒ごとに更新する。mytop.ps1
内容:
##################################################
# Linux top equivalent in PowerShell
##################################################
if ($args[0] -eq $null) {
$SortCol = "Memory"
} else {
$SortCol = $args[0]
}
if ($args[1] -eq $null) {
$Top = 30
} else {
$Top = $args[1]
}
$LogicalProcessors = (Get-WmiObject -class Win32_processor `
-Property NumberOfLogicalProcessors).NumberOfLogicalProcessors;
function myTopFunc ([string]$SortCol = "Memory", [int]$Top = 30) {
## Check user level of PowerShell
if (
([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
)
{
$procTbl = get-process -IncludeUserName | select ID, Name, UserName, Description, MainWindowTitle
} else {
$procTbl = get-process | select ID, Name, Description, MainWindowTitle
}
Get-Counter `
'\Process(*)\ID Process',`
'\Process(*)\% Processor Time',`
'\Process(*)\Working Set - Private'`
-ea SilentlyContinue |
foreach CounterSamples |
where InstanceName -notin "_total","memory compression" |
group { $_.Path.Split("\\")[3] } |
foreach {
$procIndex = [array]::indexof($procTbl.ID, [Int32]$_.Group[0].CookedValue)
[pscustomobject]@{
Name = $_.Group[0].InstanceName;
ID = $_.Group[0].CookedValue;
User = $procTbl.UserName[$procIndex]
CPU = if($_.Group[0].InstanceName -eq "idle") {
$_.Group[1].CookedValue / $LogicalProcessors
} else {
$_.Group[1].CookedValue
};
Memory = $_.Group[2].CookedValue / 1KB;
Description = $procTbl.Description[$procIndex];
Title = $procTbl.MainWindowTitle[$procIndex];
}
} |
sort -des $SortCol |
select -f $Top @(
"Name", "ID", "User",
@{ n = "CPU"; e = { ("{0:N1}%" -f $_.CPU) } },
@{ n = "Memory"; e = { ("{0:N0} K" -f $_.Memory) } },
"Description", "Title"
) | ft -a
}
myTopFunc -SortCol $SortCol -top $Top
出力例:
Name ID User CPU Memory Description
---- -- ---- --- ------ -----------
sqlservr 7776 NT SERVICE\MSSQLSERVER 0.0% 19,001,488 K SQL Server Windows NT - 64 Bit
python 12872 NA\user1 0.0% 2,159,796 K Python
svchost 3328 NT AUTHORITY\SYSTEM 1.6% 1,022,080 K Host Process for Windows Services
onedrive 11872 NA\user1 0.0% 423,396 K Microsoft OneDrive
python 13764 NA\user1 0.0% 304,608 K Python
chrome 21188 NA\user1 0.0% 250,624 K Google Chrome
python 28144 NA\user2 0.0% 225,824 K Python
code 21384 NA\user1 0.0% 211,160 K Visual Studio Code
code 27412 NA\user2 0.0% 185,892 K Visual Studio Code
ssms 18288 NA\user1 29.5% 155,452 K SSMS
chrome 7536 NA\user1 0.0% 154,124 K Google Chrome
code 21652 NA\user1 0.0% 149,900 K Visual Studio Code
explorer 3204 NA\user1 0.0% 134,340 K Windows Explorer
python 11712 NA\user1 0.0% 130,624 K Python
chrome 21588 NA\user1 0.0% 107,448 K Google Chrome
code 10152 NA\user1 0.0% 100,880 K Visual Studio Code
code 20232 NA\user2 0.0% 99,124 K Visual Studio Code
python 22184 NA\user1 0.0% 94,800 K Python
code 14828 NA\user1 0.0% 84,872 K Visual Studio Code
searchui 13344 NA\user1 0.0% 78,260 K Search and Cortana application
com.docker.service 10644 NT AUTHORITY\SYSTEM 0.0% 77,332 K Docker.Service
追加クレジット:
他に見るべきものは:
https://docs.microsoft.com/en-us/sysinternals/downloads/process-utilities
すべてのプロセス(およびもちろんProcess MonitorまたはProcess Explorer)をダンプするコマンドラインツールがあります。
以下のコマンドを使用すると、トップ10のCPU使用率が得られ、出力は5秒ごとに更新されます
while(1){ps | Sort-Object -Property cpu -Descending | select -First 10; Write-Host "出力は5秒のn
nで更新されますnハンドルNPM(K)PM(K)WS(K)CPU(s)Id SI ProcessName"; 睡眠-秒5}