将批处理脚本作为Windows服务运行 [英] Running batch script as windows service

查看:124
本文介绍了将批处理脚本作为Windows服务运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们有一个java应用程序作为服务器运行在远程windows系统上,该系统通过包含一些初始化配置的批处理脚本启动。



为了避免每次登录系统和启动/停止服务,我计划将该批处理脚本添加为Windows服务并通过命令提示符远程使用它。在失败的尝试次数后,我了解没有使用第三方软件没有简单的方法,我不允许使用由于软件使用限制。



作为一个解决方案,我写了一个C / C ++程序,可以添加为服务和使用。程序工作文件。现在我试图运行一个批处理脚本[使用system()方法]使用此代码,但批处理脚本不会被执行。



礼貌: http://www.devx.com/cplus/Article/9857



请帮我纠正问题。



批处理脚本:



batscr.bat



  
ECHO错误日志打开>​​ C:\MyServices\ERR.LOG
ECHO错误1 >> C:\MyServices\ERR.LOG
ECHO消息1 >> C:\MyServices\ERR.LOG

====== =========================================

执行批处理脚本的独立C程序



BatchExe.cpp



  
#include
#include

void main()
{
system(C:\\MyServices\ \batscr.bat);
}

================ =======



计划服务



StartScript.cpp



  

#include
#include
#include

#define SLEEP_TIME 5000
#define LOGFILEC:\\MyServices\\memstatus.txt

SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;

void ServiceMain(int argc,char ** argv);
void ControlHandler(DWORD request);
void InitService();
void main()
{
SERVICE_TABLE_ENTRY ServiceTable [2];
ServiceTable [0] .lpServiceName =StartScript;
ServiceTable [0] .lpServiceProc =(LPSERVICE_MAIN_FUNCTION)ServiceMain;

ServiceTable [1] .lpServiceName = NULL;
ServiceTable [1] .lpServiceProc = NULL;
//为我们的服务启动控制分派器线程
StartServiceCtrlDispatcher(ServiceTable);
}


void ServiceMain(int argc,char ** argv)
{
int error;

ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;

hStatus = RegistryServiceCtrlHandler(
StartScript,
(LPHANDLER_FUNCTION)ControlHandler);
if(hStatus ==(SERVICE_STATUS_HANDLE)0)
{
//注册控件处理程序失败
return;
}
//初始化服务
InitService();

//我们将运行状态报告给SCM。
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hStatus,&ServiceStatus);



return;
}

//服务初始化
void InitService()
{
system(C:\\MyServices\\batscr。蝙蝠);
return;
}

//控制处理函数
void ControlHandler(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_STOP:
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hStatus,&ServiceStatus);
return;

case SERVICE_CONTROL_SHUTDOWN:
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hStatus,&ServiceStatus);
return;

默认值:
break;
}

//报告当前状态
SetServiceStatus(hStatus,&ServiceStatus);

return;
}

感谢和问候...

解决方案

这可能会帮助你一点
在此链接



这是一个常见的问题。


We have a java application which run as server running on a remote windows system which is started though a batch script which includes some initialization configurations.

To avoid login into the system every time and starting / stopping the service I planned to add that batch script as a "Windows Service" and use it remotely through command prompt. After number of failed attempts I came to know there is no simple way of doing it without using third party software which I am not allowed to to use due software usage restrictions.

As a solution I have written a C / C++ program which can be added as a service and used. The program works file. Now I am trying to run a batch script [using system() method ] using this code but the batch script is not getting executed. Where as it works fine in stand alone mode.

Courtesy: http://www.devx.com/cplus/Article/9857

Kindly help me in rectifying the issue.

Batch Script:

batscr.bat


ECHO Error Log Open >C:\MyServices\ERR.LOG
ECHO Error 1 >>C:\MyServices\ERR.LOG
ECHO Message 1 >>C:\MyServices\ERR.LOG

================================================

Standalone C program to execute the batch script

BatchExe.cpp


#include 
#include 

void main()
{
    system("C:\\MyServices\\batscr.bat");
}

=======================

Program for the service

StartScript.cpp



#include 
#include 
#include 

#define SLEEP_TIME 5000
#define LOGFILE "C:\\MyServices\\memstatus.txt"

SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;

void  ServiceMain(int argc, char** argv);
void  ControlHandler(DWORD request);
void InitService();
void main()
{
    SERVICE_TABLE_ENTRY ServiceTable[2];
    ServiceTable[0].lpServiceName = "StartScript";
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

    ServiceTable[1].lpServiceName = NULL;
    ServiceTable[1].lpServiceProc = NULL;
    // Start the control dispatcher thread for our service
    StartServiceCtrlDispatcher(ServiceTable);
}


void ServiceMain(int argc, char** argv)
{
    int error;

    ServiceStatus.dwServiceType        = SERVICE_WIN32;
    ServiceStatus.dwCurrentState       = SERVICE_START_PENDING;
    ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
    ServiceStatus.dwWin32ExitCode      = 0;
    ServiceStatus.dwServiceSpecificExitCode = 0;
    ServiceStatus.dwCheckPoint         = 0;
    ServiceStatus.dwWaitHint           = 0;

    hStatus = RegisterServiceCtrlHandler(
        "StartScript",
        (LPHANDLER_FUNCTION)ControlHandler);
    if (hStatus == (SERVICE_STATUS_HANDLE)0)
    {
        // Registering Control Handler failed
        return;
    }
    // Initialize Service
    InitService();

    // We report the running status to SCM.
    ServiceStatus.dwCurrentState = SERVICE_RUNNING;
    SetServiceStatus (hStatus, &ServiceStatus);



    return;
}

// Service initialization
void InitService()
{
    system("C:\\MyServices\\batscr.bat");
    return;
}

// Control handler function
void ControlHandler(DWORD request)
{
    switch(request)
    {
        case SERVICE_CONTROL_STOP:
            ServiceStatus.dwWin32ExitCode = 0;
            ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
            SetServiceStatus (hStatus, &ServiceStatus);
            return;

        case SERVICE_CONTROL_SHUTDOWN:
            ServiceStatus.dwWin32ExitCode = 0;
            ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
            SetServiceStatus (hStatus, &ServiceStatus);
            return;

        default:
            break;
    }

    // Report current status
    SetServiceStatus (hStatus,  &ServiceStatus);

    return;
}

Thanks and Regards ...

解决方案

this may help you a little bit Link here

... it's quite a common problem.

这篇关于将批处理脚本作为Windows服务运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆