我遇到批处理文件问题并通过PHP执行它。
我们有一些节点服务器和Avaya CMS在访问受限的服务器上运行。
服务器需要每天重新启动,因为它们有时会崩溃,所以我创建了一个批处理文件来关闭所有cmd窗口,节点和avaya。
然后它打开所有节点服务器和avaya,启动登录到avaya的AHK脚本,最后启动一些avaya报告。
当我双击批处理文件,或者如果我通过任务计划程序运行它时,这一切都运行良好,但我们现在希望能够通过点击PHP页面上的按钮来运行它。
这是我遇到麻烦的地方。
从我所看到的,当我单击按钮时,批处理文件运行,关闭所有节点服务器,就这样,或者我想,首先。
通过一些挖掘我发现它实际上正在执行整个批处理文件,但它运行所有cmd窗口和avaya作为后台进程,我认为这是我的问题所在。
AFAIK从PHP执行批处理文件时无法打开cmd,但我认为批处理文件本身会在前台运行cmd窗口和avaya。
有没有办法实现这个目标?
以下代码,以备需要时使用。
PHP
$test = escapeshellcmd('C:\Windows\System32\cmd.exe /k
"C:\wamp\www\batch_files\R - Wallboards Script"');
system($test);
批处理文件
title Launching Servers...
echo Kill Avaya
@echo off
taskkill /f /im "acsCNTRL.exe" /T
taskkill /f /im "acsApp.exe" /T
taskkill /f /im "wscript.exe" /T
taskkill /f /im "ACScript.exe" /T
taskkill /f /im "acsSRV.exe" /T
taskkill /f /im "acsRep.exe" /T
@echo off
call getCmdPID
set "current_pid=%errorlevel%"
for /f "skip=3 tokens=2 delims= " %%a in ('tasklist /fi "imagename eq cmd.exe"') do (
if "%%a" neq "%current_pid%" (
TASKKILL /PID %%a /f /T >nul 2>nul
)
)
timeout 5
echo Kill Node
for /f "skip=3 tokens=2 delims= " %%a in ('tasklist /fi "imagename eq node.exe"') do (
if "%%a" neq "%current_pid%" (
TASKKILL /PID %%a /f /T >nul 2>nul
)
)
@REM DEFINE PATH TO BATCH FILES
SET batch_file_Path="C:\wamp\batch_files"
@REM Change directory to batch files
cd %batch_file_Path%
@REM #######################
@REM # LAUNCH NODE SERVERS #
@REM #######################
echo Launch Node Servers
@REM RADAR
start cmd /k launch_server.bat C:\wamp\www\radar
@REM RADAR_SCHEDULE
start cmd /k launch_server.bat C:\wamp\www\radar_schedule
@REM ######################################################################
@REM # LAUNCH NODE SERVERS WITH "NODE FILENAME.JS" INSTEAD OF "NPM START" #
@REM ######################################################################
@REM LOGIN_DATA_SERVER
start cmd /k launch_server_node.bat login_data_server.js
@REM WALLBOARD_SERVER
start cmd /k launch_server_node.bat wallboard_server.js
@REM SERVER
start cmd /k launch_server_node.bat server.js
@REM ########################
@REM # LAUNCH AVAYA REPORTS #
@REM ########################
echo Launch Avaya
@REM Launch CMS Supervisor and wait 10 seconds
"C:\Program Files (x86)\Avaya\CMS Supervisor R16\acsRun.exe" /L:enu
"C:\Program Files\AutoHotkey\AutoHotkey.exe" "\\Path\To\File\cmsLogin.ahk"
timeout 10
echo Launch Avaya Reports
@REM Launch Reports
"\\Path\To\File\Agent Status.acsup"
"\\Path\To\File\RE - Wallboard.acsup"
"\\Path\To\File\RD - Wallboard.acsup"
"\\Path\To\File\WT - All Agent LoginLogout.acsup"
"\\Path\To\File\WT - Agent Realtime.acsup"
timeout 2
exit
感谢您的时间:)
百里
答案 0 :(得分:1)
作为一种可能的解决方案,请考虑将运行为Web应用程序的PHP与运行批处理文件的PHP分开,并使用它们之间的某种机制相互通信。 例如,第一个PHP可以插入状态为“SUBMIT-RESTART”的mysql表行,第二个PHP可以在Windows任务调度程序中每2分钟运行一次: