我继承了一个环境,其中两个不同的进程使用相同的名称,但它们的可执行文件存储在不同的文件路径中。任何时候都可能运行一个进程、另一个进程或两个进程。
当我执行某些操作(如修补)时,我希望终止与修补目录相关的进程,但不终止其他进程。
使用各种不同的技术,我可以轻松地根据进程名称终止进程,例如(如果不使用 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"
)
或者更优雅(使用 powershell)
powershell Clear-Host
powershell Stop-Process -name procname
但是,如果这两个进程正在运行,则这两种方法都会终止它们。
我怎样才能根据可执行文件的路径来终止进程,而不是根据进程名称来终止进程?
答案1
我找到了一种做我想做的事情的方法,并想分享该解决方案。
此解决方案需要 powershell。
powershell Get-Process <ProcessName> ^| Where-Object {$_.Path -like '*<path_fragment>*'} ^| Stop-Process
** 需要使用“^|”管道来将管道保留在 powershell 解释器中。使用普通管道(“|”)似乎会将其管道回普通命令解释器并破坏命令。
为了在此代码背后赋予一些实际价值,假设要终止的进程是 Notepad++:
powershell Get-Process notepad++ ^| Where-Object {$_.Path -like '*Notepad++*'} ^| Stop-Process
这可以在批处理文件中的命令行上调用(这是我的意图)。
如果用户可以看到上述命令的输出,请在行尾放置一个 stderr 重定向到 nul。当 Get-Process 未找到任何内容时,它会发出看似相当严重的错误 - 但实际上它只是在说“我什么也没找到”。