尝试通过PowerShell脚本查找并终止进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试通过PowerShell脚本查找并终止进程相关的知识,希望对你有一定的参考价值。

我有以下脚本来查找进程“dotnet.exe”。在我的系统中,我运行了很多dotnet.exe进程。但我想杀死“dotnet.exe”,它有命令行参数“MyService Web argument”。我试图通过以下脚本来完成它。但它找不到任何东西,虽然我在任务管理器中看到了这个过程。

$process = Get-WmiObject Win32_Process | select name, commandline

foreach ($p in $process)
{
    if ($p.name -contains "dotnet.exe" -and $p.commandline -contains "web")
    {
        $kp =    Get-Process $p;
        $kp.CloseMainWindow();
        if (!$kp.HasExited)
        {
            $kp | Stop-Process -Force
        }
    }
    else
    {
        Write-Host name: $p.name and param: $p.commandline;
    }
}
答案

您需要做的就是直接通过Get-WmiObject过滤进程列表,然后终止匹配进程:

$fltr = "name like '%dotnet.exe%' and commandline like '%web%'"
Get-WmiObject Win32_Process -Filter $fltr | ForEach-Object {
    $_.Terminate()
}

你也可以直接在Terminate()的输出上调用Get-WmiObject,如下所示:

(Get-WmiObject Win32_Process -Filter $fltr).Terminate()

但是,有些情况可能会失败,例如如果Get-WmiObject没有返回任何结果,或者你正在使用PowerShell v2或更早版本而Get-WmiObject返回多个结果(将方法调用传递给数组成员需要使用PowerShell v3引入的成员枚举)。使用ForEach-Object循环更加强大且向后兼容。

另一答案

Get-WmiObject cmdlet返回非常有用的对象,但是您通过仅选择Name和CommandLine参数来剥离所有内容:

$process = Get-WmiObject Win32_Process | select name, commandline

如果你删除了| select name, commandline部分,你仍然可以遍历每个进程,但也可以使用仍然可用的Terminate()等方法。

您可以按照@ ansgar-wiechers评论一次性完成,或者仍然可以使用循环并添加更多日志记录,如果您需要:

$process = Get-WmiObject Win32_Process

foreach($p in $process){
    if($p.Name -eq "*dotnet.exe" -and $p.CommandLine -like "*web*"){
       $p.Terminate()
       # and so on... 
    }
}

另请注意@ TheIncorrigible1关于比较运算符使用的注释。我使用-eq作为进程名称,使用-like作为命令行。

以上是关于尝试通过PowerShell脚本查找并终止进程的主要内容,如果未能解决你的问题,请参考以下文章

在 32 位 powershell 中按路径查找/杀死 64 位进程

通过从 .BAT 中查找正在使用的端口来终止进程

跟踪 Windows 进程退出代码

Powershell脚本调用表达式查看传递给调用脚本的字符串参数并在其中查找错误

PowerShell 错误“在此系统上禁用脚本执行”。

PowerShell错误“在此系统上禁用了脚本的执行。”