如何终止给定可执行文件的进程 运行?
How do I kill a processes running a given executable?
我想杀了一份工作。首先,我需要它的进程 ID,所以我执行:
get-process
我得到了一大堆流程。好的,我只想要一个特定的过程,所以我使用:
get-process | select-string -pattern "nginx"
这给了我这个对象:
System.Diagnostics.Process (nginx)
我该怎么办?当我请求所有进程时,我怎样才能漂亮地打印它以给我相同的输出行?当我对给定的执行进程进行 grep 时,我基本上只想要这个:
166 11 2436 8244 0.13 24196 1 nginx
Select-String
可能不是您想要用于此特定钉子的锤子(见下文):-)
Get-Process
有一个带通配符的 -Name
参数:
Get-Process -Name nginx
# or
Get-Process -Name *nginx*
要终止进程,可以直接在对象上调用 Kill()
:
$nginxProcess = Get-Process nginx |Select -First 1
$nginxProcess.Kill()
... 或者简单地将流程实例通过管道传输到 Stop-Process
:
Get-Process -Name nginx |Stop-Process
如您所见,我们实际上从来不需要定位或传递进程 ID - Process
对象已经嵌入了该信息,并且 *-Process
cmdlet 旨在工作 一致 - PowerShell 完全是关于命令组合,这是它的一个例子。
话虽这么说,Stop-Process
也完全能够仅通过名称来终止进程:
Stop-Process -Name nginx
我怎么知道 *-Process
cmdlet 有 -Name
参数?
除了阅读 help files and documentation(我明白了,我也不想阅读任何东西,除非我绝对必须阅读 ;-)),快速了解 cmdlet 公开的参数的方法是 运行 Get-Command <commandName> -Syntax
:
PS ~> Get-Command Stop-Process -Syntax
Stop-Process [-Id] <int[]> [-PassThru] [-Force] [-WhatIf] [-Confirm] [<CommonParameters>]
Stop-Process -Name <string[]> [-PassThru] [-Force] [-WhatIf] [-Confirm] [<CommonParameters>]
Stop-Process [-InputObject] <Process[]> [-PassThru] [-Force] [-WhatIf] [-Confirm] [<CommonParameters>]
输出显示了 3 个不同的“参数集”(命令接受的参数输入的组合),以及我们可以传递给它的必需和可选参数。
Select-String
怎么了?
Select-String
cmdlet 是与 grep
同源的 PowerShell - 它需要一些输入,并根据您提供的任何模式对其执行正则表达式匹配。
但是 grep
仅在您对 字符串进行操作时才有用 - 正如您已经发现的那样,Get-Process
returns结构化 .NET 对象,而不是扁平字符串。
相反,PowerShell 惯用的方法是 过滤 数据,使用 Where-Object
cmdlet:
Get-Process | Where-Object Name -like '*nginx*'
在这里,我们指示Where-Object
只允许具有Name
属性的对象通过,其值必须满足通配符模式*nginx*
。
Where-Object
还支持 任意过滤器表达式 ,通过接受脚本块 - PowerShell 会将正在评估的当前管道对象分配给 $_
(并且 $PSItem
):
Get-Process | Where-Object { $_.Name -like '*nginx*' }
...你可以扩展到你需要的任何程度:
# Only let them through if a specific user is executing
Get-Process | Where-Object { $_.Name -like '*nginx*' -and $env:USERNAME -ne 'Quarkly'}
我想杀了一份工作。首先,我需要它的进程 ID,所以我执行:
get-process
我得到了一大堆流程。好的,我只想要一个特定的过程,所以我使用:
get-process | select-string -pattern "nginx"
这给了我这个对象:
System.Diagnostics.Process (nginx)
我该怎么办?当我请求所有进程时,我怎样才能漂亮地打印它以给我相同的输出行?当我对给定的执行进程进行 grep 时,我基本上只想要这个:
166 11 2436 8244 0.13 24196 1 nginx
Select-String
可能不是您想要用于此特定钉子的锤子(见下文):-)
Get-Process
有一个带通配符的 -Name
参数:
Get-Process -Name nginx
# or
Get-Process -Name *nginx*
要终止进程,可以直接在对象上调用 Kill()
:
$nginxProcess = Get-Process nginx |Select -First 1
$nginxProcess.Kill()
... 或者简单地将流程实例通过管道传输到 Stop-Process
:
Get-Process -Name nginx |Stop-Process
如您所见,我们实际上从来不需要定位或传递进程 ID - Process
对象已经嵌入了该信息,并且 *-Process
cmdlet 旨在工作 一致 - PowerShell 完全是关于命令组合,这是它的一个例子。
话虽这么说,Stop-Process
也完全能够仅通过名称来终止进程:
Stop-Process -Name nginx
我怎么知道 *-Process
cmdlet 有 -Name
参数?
除了阅读 help files and documentation(我明白了,我也不想阅读任何东西,除非我绝对必须阅读 ;-)),快速了解 cmdlet 公开的参数的方法是 运行 Get-Command <commandName> -Syntax
:
PS ~> Get-Command Stop-Process -Syntax
Stop-Process [-Id] <int[]> [-PassThru] [-Force] [-WhatIf] [-Confirm] [<CommonParameters>]
Stop-Process -Name <string[]> [-PassThru] [-Force] [-WhatIf] [-Confirm] [<CommonParameters>]
Stop-Process [-InputObject] <Process[]> [-PassThru] [-Force] [-WhatIf] [-Confirm] [<CommonParameters>]
输出显示了 3 个不同的“参数集”(命令接受的参数输入的组合),以及我们可以传递给它的必需和可选参数。
Select-String
怎么了?
Select-String
cmdlet 是与 grep
同源的 PowerShell - 它需要一些输入,并根据您提供的任何模式对其执行正则表达式匹配。
但是 grep
仅在您对 字符串进行操作时才有用 - 正如您已经发现的那样,Get-Process
returns结构化 .NET 对象,而不是扁平字符串。
相反,PowerShell 惯用的方法是 过滤 数据,使用 Where-Object
cmdlet:
Get-Process | Where-Object Name -like '*nginx*'
在这里,我们指示Where-Object
只允许具有Name
属性的对象通过,其值必须满足通配符模式*nginx*
。
Where-Object
还支持 任意过滤器表达式 ,通过接受脚本块 - PowerShell 会将正在评估的当前管道对象分配给 $_
(并且 $PSItem
):
Get-Process | Where-Object { $_.Name -like '*nginx*' }
...你可以扩展到你需要的任何程度:
# Only let them through if a specific user is executing
Get-Process | Where-Object { $_.Name -like '*nginx*' -and $env:USERNAME -ne 'Quarkly'}