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)
但是,如果两个进程正在运行,这两种方法都会杀死它们。
不是根据进程名称杀死这些进程,而是如何根据其可执行文件的路径杀死进程?
我找到了一种方法来做我想做的事,并认为我会分享解决方案。
此解决方案需要 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 没有找到任何东西时,它会发出一个看似相当严重的错误 - 但实际上只是它表达“我没有找到任何东西”的方式。
| 归档时间: |
|
| 查看次数: |
5119 次 |
| 最近记录: |