Php 如何在windows上杀死在后台运行的特定cmd.exe进程?
我正在实现一些用php编写的web服务,它执行一个批处理文件。 批处理代码应该如下所示:Php 如何在windows上杀死在后台运行的特定cmd.exe进程?,php,windows,batch-file,taskkill,Php,Windows,Batch File,Taskkill,我正在实现一些用php编写的web服务,它执行一个批处理文件。 批处理代码应该如下所示: for /f "usebackq tokens=2 delims=," %%i in (`tasklist /v /fo csv ^| findstr "cmd.exe" ^| findstr "THISFILE" ^| findstr /v "tasklist"`) do ( set killingpid=%%i
for /f "usebackq tokens=2 delims=," %%i in (`tasklist /v /fo csv ^| findstr "cmd.exe" ^| findstr "THISFILE" ^| findstr /v "tasklist"`) do (
set killingpid=%%i
echo !killingpid!
set killing=!killingpid:~1,-1!
echo !killing!
taskkill /f /t /pid !killing!
)
title THISFILE
rem main program starts from here.
在这个批处理文件中,我首先尝试指定由同一批处理文件(如果有的话)执行的进程ID。然后杀了它。在该名称之后是指定进程的窗口标题。然后开始主要的执行
使用“start”命令执行PHP脚本时,将弹出新的cmd窗口,程序将完美运行
$command = "start %FILEPATH%/batch.bat";
$process = popen($command, 'r');
但问题是,当我试图在后台使用“开始”来执行cmd.exe时,它将不起作用
$command = "start /b %FILEPATH%/batch.bat";
$process = popen($command, 'r');
由于其他cmd.exe程序可能正在运行,因此我无法编写类似的代码
taskkill /f /fi "imagename eq cmd.exe"
如何在不命名窗口标题的情况下终止特定进程?有人请给我一些指导。我终于使用了powershell命令。像下面这样
set PIDFile=%PATH_TO%\pid.txt
rem if the same file has been running, then kill it.
if exist "%PIDFile%" (
set /p targetPID=<%PIDFile%
taskkill /f /t /pid !targetPID!
del !PIDFile!
)
rem write this process ID down on the file so that other processces can read it.
powershell "Get-WmiObject win32_process -filter processid=$pid | ForEach-Object{$_.parentprocessid;}" >> %PATH_TO%\pid.txt
rem main process here
del !PIDfile!
将PIDFile=%PATH\u设置为%\pid.txt
rem如果同一个文件一直在运行,则杀死它。
如果存在“%PIDFile%”(
将/p targetPID=>%PATH\u设置为%\pid.txt
这里的主要过程是什么
德尔!皮德档案!
start/b
使已启动的进程共享同一控制台(以及它的标题)通过它的主进程,输入和输出交替地由一个进程或另一个进程处理。虽然您可能可以区分哪个输出来自哪个进程,但您永远无法确定,哪个进程现在尝试接受您的输入。因此我不确定这是否是一个好方法(Ymmv)。但无论如何:使用start/b
启动的进程具有窗口标题N/A
(取决于语言!)-尽管使用了Title
命令,该命令设置了控制台的标题(该控制台仍归motherprocess所有!)Stephan,谢谢你的评论。当通过web服务器运行“start/b”命令时,没有控制台可供共享。正如你所指出的,窗口标题将是“N/A”。(它可以被视为一种“后台进程”,不是吗)。无论如何,我不希望在完成此任务时弹出任何控制台。将findstr“THISFILE”
替换为findstr“N/A”
?(顺便说一句:%%~I
删除引号,所以只要taskkill/f/t/pid:%%~I
就可以完成此任务。)