根据图像路径杀死进程

Jim*_*m2B 5 windows-7 powershell batch-file

我继承了一个环境,其中两个不同的进程使用相同的名称,但它们的可执行文件存储在不同的文件路径中。任何时候都可能没有、一个、另一个或两者都在运行。

当我执行某些操作(如修补)时,我希望与修补目录关联的进程被终止,而不是另一个。

使用各种不同的技术,我可以毫不费力地根据进程名称终止进程,例如(不使用 powershell 不太优雅):

echo Checking for procname process...
tasklist /FI "IMAGENAME eq procname .exe" | !windir!\system32\find /I "procname.exe" 
set EL=!ERRORLEVEL!
if !EL! EQU 0 (
    echo Killing procname process...
    TASKKILL /F /FI "IMAGENAME eq procname.exe"
)
Run Code Online (Sandbox Code Playgroud)

或更优雅(使用powershell)

powershell Clear-Host 
powershell Stop-Process -name procname
Run Code Online (Sandbox Code Playgroud)

但是,如果两个进程正在运行,这两种方法都会杀死它们。

不是根据进程名称杀死这些进程,而是如何根据其可执行文件的路径杀死进程?

Jim*_*m2B 3

我找到了一种方法来做我想做的事,并认为我会分享解决方案。

此解决方案需要 powershell。

powershell Get-Process <ProcessName> ^| Where-Object {$_.Path -like '*<path_fragment>*'} ^| Stop-Process
Run Code Online (Sandbox Code Playgroud)

** “^|” 需要使用管道来将管道保留在 powershell 解释器中。使用普通管道(“|”)似乎将其通过管道返回到普通命令解释器并中断命令。

为了在这段代码后面添加一些实际值,假设要终止的进程是 Notepad++:

powershell Get-Process notepad++ ^| Where-Object {$_.Path -like '*Notepad++*'} ^| Stop-Process
Run Code Online (Sandbox Code Playgroud)

这可以在批处理文件中的命令行上调用(这是我的意图)。

如果用户可能会看到上述命令的输出,请将 stderr 重定向到该行末尾的 nul 。当 Get-Process 没有找到任何东西时,它会发出一个看似相当严重的错误 - 但实际上只是它表达“我没有找到任何东西”的方式。