PowerShell - 概述¶
Windows PowerShell 是专为系统管理而设计的**命令行 shell** 和**脚本语言**。 它在 Linux 中的类似物称为 Bash 脚本。 Windows PowerShell 基于 .NET Framework 构建,可帮助 IT 专业人员控制和自动化管理 Windows 操作系统和 Windows Server 环境上运行的应用程序。
Windows PowerShell 命令称为**cmdlet**,可让您从命令行管理计算机。 Windows PowerShell 提供程序使您可以像访问文件系统一样轻松地访问数据存储,例如注册表和证书存储。
此外,Windows PowerShell 还拥有丰富的表达式解析器和完全开发的脚本语言。 简而言之,您可以完成使用 GUI 执行的所有任务以及更多任务。
PowerShell 基本命令¶
PowerShell 命令非常多,在本教程中很难包含所有这些命令,我们将重点介绍 PowerShell 中一些最重要和基本的命令。
第一步是转到 Get-Help 命令,该命令向您提供有关如何给出命令及其参数的说明。

可以使用get-help查看每个命令的具体用法
PowerShell 版本¶
我们键入以下命令 :$PSVersionTable,如下面的屏幕截图所示

PowerShell ISE¶
Windows PowerShell 集成脚本环境 (ISE) 是 Windows PowerShell 的主机应用程序。 在 Windows PowerShell ISE 中,您可以在基于 Windows 的单个图形用户界面中运行命令并编写、测试和调试脚本,其中包括多行编辑、制表符补全、语法着色、选择性执行、上下文相关帮助、以及对从右到左语言的支持。
您可以使用菜单项和键盘快捷键来执行许多与在 Windows PowerShell 控制台中执行的任务相同的任务。 例如,当您在 Windows PowerShell ISE 中调试脚本时,要在脚本中设置行断点,请右键单击代码行,然后单击**切换断点**。
要打开它,您只需转到"开始"-"搜索",然后键入"PowerShell",如下面的屏幕截图所示。

打开后界面如下图所示:

你可以在其中编写和调试powershell脚本,类似编译器
PowerShell 基本命令¶
PowerShell 命令非常多,在本教程中很难包含所有这些命令,我们将重点介绍 PowerShell 中一些最重要和基本的命令。
第一步是转到 Get-Help 命令,该命令向您提供有关如何给出命令及其参数的说明。
显示所有命令及别名¶
get-command
# 显示function
Get-Command -Type Function | Sort-Object -Property Noun | Format-Table -GroupBy Noun
# 显示所有别名
Get-Command -Type Alias | Sort-Object -Property Noun | Format-Table -GroupBy Noun
or
get-alias
# 显示所有cmdlet
Get-Command -Type Cmdlet | Sort-Object -Property Noun | Format-Table -GroupBy Noun

cmdlet 命令¶
cmdlet 或"Command let"是 Windows PowerShell 环境中使用的轻量级命令。 Windows PowerShell 运行时在命令提示符下调用这些 cmdlet。 您可以通过 Windows PowerShell API 以编程方式创建和调用它们。
Cmdlet 与 Command¶
Cmdlet 与其他命令 shell 环境中的命令有以下不同之处 −
- Cmdlet 是 .NET Framework 类对象; 而不仅仅是独立的可执行文件。
- 只需十几行代码即可轻松构建 Cmdlet。
- cmdlet 不处理解析、错误表示和输出格式。 它由 Windows PowerShell 运行时完成。
- Cmdlet 进程适用于对象而不是文本流,并且对象可以作为管道的输出进行传递。
- Cmdlet 是基于记录的,因为它们一次处理一个对象。
显示可用的cmdlet¶

别名¶
PowerShell 别名是 cmdlet 或任何命令元素的另一个名称。
创建别名¶
使用**New-Alias** cmdlet 创建别名。 在下面的示例中,我们为 Get-Help cmdlet 创建了别名帮助。
现在调用别名
获取别名¶
使用 get-alias cmdlet 获取当前 Powershell 会话中存在的所有别名。
获取补丁更新¶

这与我们使用systeminfo查看到的补丁信息是一致的
获取Path¶

在默认情况下,搜索是在当前目录和 PATH 环境变量指定的路径中执行的。
这类似linux的which命令
文件和文件夹操作¶
创建文件夹/文件¶
- 文件夹
New-Item -Path 'D:\temp\Test Folder' -ItemType Directory
# format: New-Item -Path '<path>' -ItemType <type>
- 文件
复制文件夹/文件¶
- 文件夹
Copy-Item 'D:\temp\Test Folder' 'D:\temp\Test Folder1'
# 递归复制,类似linux的`cp -r`
Copy-Item 'D:\temp\Test Folder' -Destination 'D:\temp\Test Folder1'
# format: Copy-Item <source> [options] <destination>
- 文件
Copy-Item 'D:\temp\Test Folder\Test File.txt' 'D:\temp\Test Folder1\Test File1.txt'
# 递归的复制所有txt文件
Copy-Item -Filter *.txt -Path 'D:\temp\Test Folder' -Recurse -Destination 'D:\temp\Test Folder1'
删除文件夹/文件¶
- 文件夹
Remove-Item 'D:\temp\Test Folder1'
# 我们将递归删除文件夹 D:\Temp\Test Folder1。 在第一个示例中,PowerShell 确认目录是否不为空。 在这种情况下,它只会删除该项目。
Remove-Item 'D:\temp\Test Folder' -Recurse
# format: Remove-Item <path> [options]
- 文件
移动文件夹/文件¶
- 文件夹
- 文件
重命名文件夹/文件¶
- 文件夹
- 文件
文件检索¶
Get-ChildItem -Path C:\pc
# 递归的显示文件
Get-ChildItem -Path C:\pc -Filter car.png -Recurse -ErrorAction SilentlyContinue -Force
# 搜索所有子目录下的txt文件
# 它包括文件的 Path、Mode、LastWriteTime、Length 和 Name
Get-ChildItem -Path C:\pc -Filter *.txt -Recurse -ErrorAction SilentlyContinue -Force
# 只显示txt文件的文件名
Get-ChildItem -Path C:\pc -Filter *.txt -Recurse -ErrorAction SilentlyContinue -Force | %{$_.FullName}


文件夹/文件是否存在¶
- 文件夹
Test-Path D:\temp\test
# if file is exist, return true
# if not, return false
# format: Test-Path <file_path>
- 文件
日期和时间操作¶
文件 I/O 操作¶
创建文本文件¶
New-Item D:\temp\test\test.txt
# 写入内容
Set-Content D:\temp\test\test.txt 'Welcome to TutorialsPoint'
读取文本文件¶
删除文件内容¶
将内容附加到文件¶
需要注意的是,Set-Content采取是覆盖写入
others¶
查找字符串¶
Select-String
[-Culture <String>]
-InputObject <PSObject>
[-Pattern] <String[]>
-Raw
[-SimpleMatch]
[-CaseSensitive]
[-List]
[-NoEmphasis]
[-Include <String[]>]
[-Exclude <String[]>]
[-NotMatch]
[-AllMatches]
[-Encoding <Encoding>]
[-Context <Int32[]>]
[<CommonParameters>]
Select-String cmdlet 使用正则表达式匹配来搜索输入字符串和文件中的文本模式。 可以使用 Select-String,它类似于 UNIX 中的 grep 或 Windows 中的 findstr.exe。
Select-String 基于文本行。 默认情况下,Select-String 将查找每行中的第一个匹配项,并且对于每个匹配项,它都将显示文件名、行号和包含该匹配项的行中的所有文本。 可以指示 Select-String 查找每行的多个匹配项、显示该匹配项的前后文本,或显示一个用于指示是否找到匹配项的布尔值(True 或 False)。
Select-String 可以显示每个输入文件的所有文本匹配项或者在找到第一个匹配项后停止。 Select-String 还可以显示与指定的模式不匹配的所有文本。
你还可以指定 Select-String 应需要特定的字符编码,如在搜索 Unicode 文本的文件时。 Select-String 使用字节顺序标记 (BOM) 检测文件的编码格式。 如果文件没有 BOM,则会假定编码为 UTF8。
查找区分大小写的匹配项¶
Hello 和 HELLO 的文本字符串将向下发送到 Select-String cmdlet。 Select-String 使用 Pattern 参数来指定 HELLO。 CaseSensitive 参数指定大小写必须仅匹配大写模式。 SimpleMatch 是一个可选参数,指定模式中的字符串不解释为正则表达式。 Select-String 在 PowerShell 控制台中显示 HELLO。
查找文本文件中的匹配项¶
Get-Alias | Out-File -FilePath .\Alias.txt
Get-Command | Out-File -FilePath .\Command.txt
Select-String -Path .\*.txt -Pattern 'Get-'
Alias.txt:8:Alias cat -> Get-Content
Alias.txt:28:Alias dir -> Get-ChildItem
Alias.txt:43:Alias gal -> Get-Alias
Command.txt:966:Cmdlet Get-Acl
Command.txt:967:Cmdlet Get-Alias
在此示例中,Get-Alias 和 Get-Command 用于 Out-File cmdlet 在当前目录中创建两个文本文件:Alias.txt 和 Command.txt。
Select-String 使用带星号 (*) 通配符的 Path 参数搜索当前目录中文件扩展名为 .txt 的所有文件。 Pattern 参数指定要匹配 Get- 的文本。 Select-String 在 PowerShell 控制台中显示输出。 文件名和行号位于每个内容行前面,其中包含 Pattern 参数的匹配项。
查找模式匹配项¶

Select-String cmdlet 使用两个参数:Path 和 Pattern。 Path 参数使用指定 PowerShell 目录的变量 $PSHOME。 路径的其余部分包括子目录 en-US,并指定目录中的每个 *.txt 文件。 **Pattern**参数指定匹配每个文件中的问号 (?)。 反斜杠 (\) 用作转义字符,并且是必需的,因为问号 (?) 是正则表达式限定符。 Select-String 在 PowerShell 控制台中显示输出。 文件名和行号位于每个内容行前面,其中包含 Pattern 参数的匹配项。
在 Windows 事件日志中搜索字符串¶
$Events = Get-WinEvent -LogName Application -MaxEvents 50
$Events | Select-String -InputObject {$_.message} -Pattern 'Failed'
Get-WinEvent cmdlet 使用 LogName 参数来指定应用程序日志。 MaxEvents 参数从日志中获取 50 个最新事件。 日志内容存储在名为 $Events 的变量中。
$Events 变量沿管道向下发送到 Select-String cmdlet。 Select-String 使用 InputObject 参数。 $_ 变量表示当前对象,message 是事件的一个属性。 Pattern 参数指定字符串 Failed 并搜索匹配项$_.message。 Select-String 在 PowerShell 控制台中显示输出。
在子目录中查找字符串¶
Get-ChildItem -Path C:\Windows\System32\*.txt -Recurse | Select-String -Pattern 'Microsoft' -CaseSensitive
Get-ChildItem 使用 Path 参数指定 C:\Windows\System32*.txt。 Recurse 参数包括子目录。 对象沿着管道发送到 Select-String。
Select-String 使用 Pattern 参数并指定 Microsoft 字符串。 CaseSensitive 参数用于匹配字符串的确切大小写。 Select-String 在 PowerShell 控制台中显示输出。
查找与模式不匹配的字符串¶
Get-Command | Out-File -FilePath .\Command.txt
Select-String -Path .\Command.txt -Pattern 'Get', 'Set' -NotMatch
Get-Command cmdlet 将对象沿管道发送到 Out-File,以在当前目录中创建 Command.txt 文件。 Select-String 使用 Path 参数指定 Command.txt 文件。 Pattern 参数指定 Get 和 Set 作为搜索模式。 NotMatch 参数从结果中排除 Get 和 Set。 Select-String 在 PowerShell 控制台中显示不包含 Get 或 Set 的输出。
使用“Out-String”将管道对象转换为字符串¶
PS> $hash = @{
Name = 'foo'
Category = 'bar'
}
# !! NO output, due to .ToString() conversion
$hash | Select-String -Pattern 'foo'
# Out-String converts the output to a single multi-line string object
PS> $hash | Out-String | Select-String -Pattern 'foo'
Name Value
---- -----
Name foo
Category bar
# Out-String -Stream converts the output to a multiple single-line string objects
PS> $hash | Out-String -Stream | Select-String -Pattern 'foo'
Name foo
通过管道传递至 Out-String -Stream 会格式化输出转换为多个单行字符串对象。 这意味着,当 Select-String 找到匹配项时,它只输出匹配行。
refer¶
Select-String (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Learn
其他cmdlet¶
PowerShell脚本¶
Windows PowerShell 是专为系统管理而设计的**命令行 shell** 和**脚本语言**。 它在 Linux 中的类似物称为 Bash 脚本。 Windows PowerShell 基于 .NET Framework 构建,可帮助 IT 专业人员控制和自动化管理 Windows 操作系统和 Windows Server 环境上运行的应用程序。
Windows PowerShell 命令称为**cmdlet**,可让您从命令行管理计算机。 Windows PowerShell 提供程序使您可以像访问文件系统一样轻松地访问数据存储,例如注册表和证书存储。
此外,Windows PowerShell 还拥有丰富的表达式解析器和完全开发的脚本语言。 简而言之,您可以完成使用 GUI 执行的所有任务以及更多任务。 Windows PowerShell Scripting 是一种完全开发的脚本语言,具有丰富的表达式解析器/
功能¶
- Cmdlet − Cmdlet 执行常见的系统管理任务,例如管理注册表、服务、进程、事件日志以及使用 Windows Management Instrumentation (WMI)。
- 以任务为导向 − PowerShell 脚本语言是基于任务的,并为现有脚本和命令行工具提供支持。
- 一致的设计 − 由于 cmdlet 和系统数据存储使用通用语法并具有通用命名约定,因此数据共享很容易。 一个 cmdlet 的输出可以通过管道传输到另一个 cmdlet,无需任何操作。
- 使用简单 − 简化的基于命令的导航使用户可以像文件系统导航一样导航注册表和其他数据存储。
- 基于对象 − PowerShell拥有强大的对象操作能力。 对象可以直接发送到其他工具或数据库。
- 可扩展接口 − PowerShell 是可定制的,因为独立软件供应商和企业开发人员可以使用 PowerShell 构建自定义工具和实用程序来管理其软件。
特殊变量¶
PowerShell 特殊变量存储有关 PowerShell 的信息。 这些也称为自动变量。 以下是自动变量列表
| 运算符 | 描述 |
|---|---|
| $$ | 表示会话收到的最后一行中的最后一个令牌。 |
| $? | 表示上次操作的执行状态。 如果最后一次操作成功则包含 TRUE,如果失败则包含 FALSE。 |
| $^ | 表示会话收到的最后一行中的第一个令牌。 |
| $_ | 与 $PSItem 相同。 包含管道对象中的当前对象。 您可以在对管道中的每个对象或选定对象执行操作的命令中使用此变量。 |
| $ARGS | 表示传递给函数、脚本或脚本块的未声明参数和/或参数值的数组。 |
| $CONSOLEFILENAME | 表示会话中最近使用的控制台文件 (.psc1) 的路径。 |
| $ERROR | 表示一个错误对象数组,这些对象代表最近的错误。 |
| $EVENT | 表示 PSEventArgs 对象,该对象表示正在处理的事件。 |
| $EVENTARGS | 表示一个对象,该对象表示从正在处理的事件的 EventArgs 派生的第一个事件参数。 |
| $EVENTSUBSCRIBER | 表示一个 PSEventSubscriber 对象,该对象表示正在处理的事件的事件订阅者。 |
| $EXECUTIONCONTEXT | 表示 EngineIntrinsics 对象,该对象表示 PowerShell 主机的执行上下文。 |
| $FALSE | 代表FALSE。 您可以在命令和脚本中使用此变量来表示 FALSE,而不是使用字符串"false"。 |
| $FOREACH | 表示 ForEach 循环的枚举数(不是结果值)。 您可以对 $ForEach 变量的值使用枚举器的属性和方法。 |
| $HOME | 表示用户主目录的完整路径。 |
| $HOST | 代表一个对象,该对象代表 PowerShell 的当前主机应用程序。 |
| $INPUT | 表示一个枚举器,用于枚举传递给函数的所有输入。 |
| $LASTEXITCODE | 表示最后运行的基于 Windows 的程序的退出代码。 |
| $MATCHES | $Matches 变量与 -match 和 -notmatch 运算符一起使用。 |
| $MYINVOCATION | $MyInspiration 仅针对脚本、函数和脚本块填充。 $MyInspiration 自动变量的 PSScriptRoot 和 PSCommandPath 属性包含有关调用者或调用脚本的信息,而不是当前脚本的信息。 |
| $NESTEDPROMPTLEVEL | 代表当前提示级别。 |
| $NULL | $null 是包含 NULL 或空值的自动变量。 您可以使用此变量来表示命令和脚本中不存在或未定义的值。 |
| $PID | 表示托管当前 PowerShell 会话的进程的进程标识符 (PID)。 |
| $PROFILE | 表示当前用户和当前主机应用程序的 PowerShell 配置文件的完整路径。 |
| $PSCMDLET | 代表一个对象,该对象代表正在运行的 cmdlet 或高级函数。 |
| $PSCOMMANDPATH | 表示正在运行的脚本的完整路径和文件名。 |
| $PSCULTURE | 表示操作系统中当前使用的区域性名称。 |
| $PSDEBUGCONTEXT | 调试时,该变量包含有关调试环境的信息。 否则,它包含 NULL 值。 |
| $PSHOME | 表示 PowerShell 安装目录的完整路径。 |
| $PSITEM | 与$_相同。 包含管道对象中的当前对象。 |
| $PSSCRIPTROOT | 表示正在运行脚本的目录。 |
| $PSSENDERINFO | 表示有关启动 PSSession 的用户的信息,包括用户身份和发起计算机的时区。 |
| $PSUICULTURE | 表示操作系统中当前使用的用户界面 (UI) 区域性的名称。 |
| $PSVERSIONTABLE | 表示一个只读哈希表,显示有关当前会话中运行的 PowerShell 版本的详细信息。 |
| $SENDER | 表示生成此事件的对象。 |
| $SHELLID | 表示当前shell的标识符。 |
| $STACKTRACE | 表示最近错误的堆栈跟踪。 |
| $THIS | 在定义脚本属性或脚本方法的脚本块中,$This 变量引用正在扩展的对象。 |
| $TRUE | 代表 TRUE。 您可以使用此变量在命令和脚本中表示 TRUE。 |
运算符¶
PowerShell 提供了一组丰富的运算符来操作变量。 我们可以将所有 PowerShell 运算符分为以下几组 −
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 重定向运算符
- 拆分和连接运算符
- 类型运算符
- 一元运算符
算术运算符¶
| 运算符 | 描述 | 示例 |
|---|---|---|
| + (加法) | 在运算符两侧添加值。 | A + B 将给出 30 |
| - (减法) | 从左侧操作数中减去右侧操作数。 | A - B 将给出 -10 |
| * (乘法) | 将运算符两侧的值相乘。 | A * B 将给出 200 |
| /(除法) | 将左侧操作数除以右侧操作数。 | B / A 将给出 2 |
| %(模数) | 将左侧操作数除以右侧操作数并返回余数。 | B % A 将给出 0 |
比较运算符¶
| 运算符 | 描述 | 示例 |
|---|---|---|
| eq(等于) | 比较两个值是否相等。 | A -eq B 将给出 false |
| ne(不等于) | 比较两个值是否不相等。 | A -ne B 给出 true |
| gt(大于) | 比较第一个值是否大于第二个值。 | B -gt A 将给出 true |
| ge(大于或等于) | 比较第一个值是否大于或等于第二个值。 | B -ge A 将给出 true |
| lt(小于) | 比较第一个值是否小于第二个值。 | B -lt A 将给出 false |
| le (小于或等于) | 比较第一个值是否小于或等于第二个值。 | B -le A 会给出 false |
赋值运算符¶
| 运算符 | 描述 | 示例 |
|---|---|---|
| = | 简单的赋值运算符。 将右侧操作数中的值分配给左侧操作数。 | C = A + B 将 A + B 的值赋给 C |
| += | 添加 AND 赋值运算符。 它将右操作数添加到左操作数,并将结果分配给左操作数。 | C += A 相当于 C = C + A |
| -= | 减去 AND 赋值运算符。 它从左操作数中减去右操作数,并将结果赋给左操作数。 | C -= A 相当于 C = C - A |
逻辑运算符¶
| 运算符 | 描述 | 示例 |
|---|---|---|
| AND(逻辑与) | 称为逻辑与运算符。 如果两个操作数都非零,则条件为 true。 | (A -AND B) 为 false |
| OR(逻辑或) | 称为逻辑或运算符。 如果两个操作数中有任何一个非零,则条件为 true。 | (A -OR B)为 true |
| NOT(逻辑非) | 称为逻辑非运算符。 用于反转其操作数的逻辑状态。 如果条件为 true,则逻辑 NOT 运算符将为 false。 | -NOT(A -AND B) 为 true |
其他运算符¶
| 运算符 | 描述 | 示例 |
|---|---|---|
| > (重定向运算符) | 重定向运算符。 分配要打印到重定向文件/输出设备的输出。 | dir > test.log 将在 test.log 文件中打印目录列表 |
循环¶
可能存在这样的情况:您需要多次执行一段代码。 一般来说,语句是按顺序执行的:首先执行函数中的第一条语句,然后执行第二条语句,依此类推。
编程语言提供各种控制结构,允许更复杂的执行路径。
**循环**语句允许我们多次执行一条语句或一组语句,以下是大多数编程语言中循环语句的一般形式 −

PowerShell 编程语言提供以下类型的循环来处理循环要求
- for
- while
- foreach
- do...while
refer¶
决策语句¶
决策结构具有由程序评估或测试的一个或多个条件,以及在确定条件为 true 时要执行的一个或多个语句,并且如果条件被确定为 false,则执行其他语句。
以下是大多数编程语言中常见的典型决策结构的一般形式−

PowerShell 脚本语言提供以下类型的决策语句
- if
- if...else
- switch
refer¶
数组¶
PowerShell 提供了一种数据结构,即**数组**,它存储任意类型元素的固定大小的顺序集合。 数组用于存储数据集合,但将数组视为变量或对象的集合通常更有用。
不要声明单独的变量,例如 number0、number1、... 和 number99,您声明一个数组变量,例如数字,并使用数字[0]、数字[1]和...、数字[99]来表示各个变量。
本教程介绍如何声明数组变量、创建数组以及使用索引变量处理数组。
声明数组变量¶
要在程序中使用数组,必须声明一个变量来引用该数组,并且可以指定该变量可以引用的数组类型。 这是声明数组变量的语法 −
语法¶
注意 − 默认情况下,数组对象的类型是System.Object。 GetType() 方法返回数组的类型。 类型可以传递。
refer¶
哈希表¶
哈希表将键/值对存储在哈希表中。 使用哈希表时,您可以指定用作键的对象以及要链接到该键的值。 一般我们使用字符串或者数字作为键。
本教程介绍如何声明哈希表变量、创建哈希表以及哈希表处理使用方法。
声明哈希表变量¶
要在程序中使用哈希表,您必须声明一个变量来引用该哈希表。 这是声明哈希表变量的语法 −
语法¶
注意 −可以使用类似的语法创建有序字典。 有序字典保持条目添加的顺序,而哈希表则不然。
refer¶
反引号¶
反引号 () 运算符也称为自动换行运算符。 它允许将命令写入多行。 它也可用于句子中的换行符 (n) 或制表符 (`t)。 请参阅下面的示例
Get-Service * | Sort-Object ServiceType `
| Format-Table Name, ServiceType, Status -AutoSize
会变成
Get-Service * | Sort-Object ServiceType | Format-Table Name, ServiceType, Status -AutoSize
验证输出为
Name ServiceType Status
---- ----------- ------
MSSQLServerADHelper100 Win32OwnProcess Stopped
ntrtscan Win32OwnProcess Running
...
括号¶
Powershell 支持三种类型的括号。
- 小括号(圆括号) −()
- 大括号 −{}
- 方括号 −[]
小括号(圆括号)¶
这种类型的括号用于
- 传递参数
- 附上多组指令
- 消除歧义
- 创建数组
> $array = @("item1", "item2", "item3")
> foreach ($element in $array) { $element }
item1
item2
item3
大括号¶
这种类型的括号用于
- 附加语句
- 块命令
示例¶
这将产生以下结果
方括号¶
这种类型的括号用于
- 访问数组
- 访问哈希表
- 使用正则表达式过滤
> $array = @("item1", "item2", "item3")
> for($i = 0; $i -lt $array.length; $i++){ $array[$i] }
item1
item2
item3
>Get-Process [r-s]*
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
320 72 27300 33764 227 3.95 4028 SCNotification
2298 77 57792 48712 308 2884 SearchIndexer
...