当来自 taskscheduler 的 运行 时如何将进程名称分配给批处理文件
How to assign process name to batch file when running from taskscheduler
我正在 运行 在 Windows Server 2012 上安装一个 Web 应用程序,并且必须 运行 在 PHP 文件中无限循环。为了控制这个,我创建了两个批处理文件。
PHP 文件:
<?php
while(true) {
sleep(10);
}
?>
调用 PHP 文件的 BatchFile:
TITLE WatchdogStarterBATCH
php "%~dp0watchdog.php"
timeout 5
批处理文件 2
@ECHO OFF
:: Detect whether program is running
for /f "tokens=2 delims=," %%P in ('tasklist /v /fo csv ^| findstr /i "WatchdogStarterBATCH"') do set pid=%%~P
IF [%pid%] == [] (
:: Program not running, trying to restart
start "WatchdogStarterBATCH" "%~dp0WatchdogStarter.bat"
timeout 5
GOTO rerun
) ELSE (
:: Program is running
GOTO end
)
:rerun
:: Check whether program is running now
for /f "tokens=2 delims=," %%P in ('tasklist /v /fo csv ^| findstr /i "WatchdogStarterBATCH"') do set pid=%%~P
IF [%pid%] == [] (
:: Restart failed, log to database
php "%~dp0WatchdogErrorLogger.php"
) ELSE (
:: Restart successful, log to database
php "%~dp0WatchdogWarningLogger.php"
GOTO end
)
:end
echo Done.
timeout 5
批处理文件 2 由任务计划程序调用,然后如您所见调用 WatchdogStarter.bat。它会尝试为该服务命名,以便稍后可以在任务列表中找到它。
我尝试过的事情:
- 运行 batfile2 从命令行检查我是否可以在任务列表中找到字符串 "WatchdogStarterBATCH"。我能够找到它,所以它有效。
- 尝试在我使用的 'start' 命令中分配一个名称,但这没有帮助。
- 尝试在第一个批处理文件中使用 'TITLE' 指定名称,但这没有帮助。
这是vbs。
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objWMIService = GetObject("winmgmts:\.\root\CIMV2")
Set objEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM Win32_ProcessStopTrace")
Do
Set objReceivedEvent = objEvents.NextEvent
msgbox objReceivedEvent.ProcessName
If lcase(objReceivedEvent.ProcessName) = lcase("Notepad.exe") then
Msgbox "Process exited with exit code " & objReceivedEvent.ExitStatus
WshShell.Run "c:\Windows\notepad.exe", 1, false
End If
Loop
它的作用是等待程序退出(所有程序),如果记事本(在示例中)重新启动它。您会检查 php.exe 或任何名称。
或使用以下命令获取命令行并通过 PID 进行检查。
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_Process")
For Each objItem in colItems
msgbox objItem.ProcessID & " " & objItem.CommandLine
Next
使用 Instr 在命令行中检查您的 PHP 文件名并存储 PID。
这也行
Set WshShell = WScript.CreateObject("WScript.Shell")
Do
Return = WshShell.Run("notepad " & WScript.ScriptFullName, 0, true)
Loop
它启动记事本并等待它退出,然后永远重新启动它。
批量相同的技术
:ALabel
start "" /w notepad.exe
Goto ALabel
我正在 运行 在 Windows Server 2012 上安装一个 Web 应用程序,并且必须 运行 在 PHP 文件中无限循环。为了控制这个,我创建了两个批处理文件。
PHP 文件:
<?php
while(true) {
sleep(10);
}
?>
调用 PHP 文件的 BatchFile:
TITLE WatchdogStarterBATCH
php "%~dp0watchdog.php"
timeout 5
批处理文件 2
@ECHO OFF
:: Detect whether program is running
for /f "tokens=2 delims=," %%P in ('tasklist /v /fo csv ^| findstr /i "WatchdogStarterBATCH"') do set pid=%%~P
IF [%pid%] == [] (
:: Program not running, trying to restart
start "WatchdogStarterBATCH" "%~dp0WatchdogStarter.bat"
timeout 5
GOTO rerun
) ELSE (
:: Program is running
GOTO end
)
:rerun
:: Check whether program is running now
for /f "tokens=2 delims=," %%P in ('tasklist /v /fo csv ^| findstr /i "WatchdogStarterBATCH"') do set pid=%%~P
IF [%pid%] == [] (
:: Restart failed, log to database
php "%~dp0WatchdogErrorLogger.php"
) ELSE (
:: Restart successful, log to database
php "%~dp0WatchdogWarningLogger.php"
GOTO end
)
:end
echo Done.
timeout 5
批处理文件 2 由任务计划程序调用,然后如您所见调用 WatchdogStarter.bat。它会尝试为该服务命名,以便稍后可以在任务列表中找到它。
我尝试过的事情:
- 运行 batfile2 从命令行检查我是否可以在任务列表中找到字符串 "WatchdogStarterBATCH"。我能够找到它,所以它有效。
- 尝试在我使用的 'start' 命令中分配一个名称,但这没有帮助。
- 尝试在第一个批处理文件中使用 'TITLE' 指定名称,但这没有帮助。
这是vbs。
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objWMIService = GetObject("winmgmts:\.\root\CIMV2")
Set objEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM Win32_ProcessStopTrace")
Do
Set objReceivedEvent = objEvents.NextEvent
msgbox objReceivedEvent.ProcessName
If lcase(objReceivedEvent.ProcessName) = lcase("Notepad.exe") then
Msgbox "Process exited with exit code " & objReceivedEvent.ExitStatus
WshShell.Run "c:\Windows\notepad.exe", 1, false
End If
Loop
它的作用是等待程序退出(所有程序),如果记事本(在示例中)重新启动它。您会检查 php.exe 或任何名称。
或使用以下命令获取命令行并通过 PID 进行检查。
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_Process")
For Each objItem in colItems
msgbox objItem.ProcessID & " " & objItem.CommandLine
Next
使用 Instr 在命令行中检查您的 PHP 文件名并存储 PID。
这也行
Set WshShell = WScript.CreateObject("WScript.Shell")
Do
Return = WshShell.Run("notepad " & WScript.ScriptFullName, 0, true)
Loop
它启动记事本并等待它退出,然后永远重新启动它。
批量相同的技术
:ALabel
start "" /w notepad.exe
Goto ALabel