Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在windows上杀死在后台运行的特定cmd.exe进程?_Php_Windows_Batch File_Taskkill - Fatal编程技术网

Php 如何在windows上杀死在后台运行的特定cmd.exe进程?

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

我正在实现一些用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
    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
就可以完成此任务。)