我有以下脚本来查找进程“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;
}
}
答案 0 :(得分:0)
Get-WmiObject
cmdlet会返回非常有用的对象,但您只通过选择名称和 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
作为命令行。
答案 1 :(得分:0)
您需要做的就是直接通过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
循环更加强大且向后兼容。