从Windows服务调用批处理文件

时间:2011-03-16 15:04:48

标签: c windows service

我有一个服务需要在将新文件复制到目录时调用批处理。我尝试使用CreateProcessShellExecuteShellExecuteEx甚至system。我尝试直接调用批处理,然后调用cmd.exe并将/c batchfile作为参数传递......没有。 我将服务设置为以管理员身份运行。我和其他用户一起试过了。什么都没有。

这是Windows 2008服务器。

有什么想法吗? 谢谢。

3 个答案:

答案 0 :(得分:0)

CreateProcess,如下面(粗略简化)示例所示,是从服务执行批处理文件的有效方法。

STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };
si.cb = sizeof(si);

if( !CreateProcessA( NULL,
                     "C:\\test.bat",
                     NULL,
                     NULL,
                     FALSE,
                     0,
                     NULL,
                     NULL,
                     &si,
                     &pi
                   ) )
{
    char msg[100];
    sprintf( msg, "CreateProcess() failed: %d", GetLastError() );
    OutputDebugStringA( msg );
}

记录是关键。如果没有执行批处理文件,CreateProcess()将告诉您原因。

您提到批处理文件将在“将新文件复制到目录时执行”。您是否已验证检测代码是否正常工作?试图执行批处理文件的代码是否实际到达了?

更多背景肯定会有所帮助。请发布批处理文件和服务代码的相关部分。

答案 1 :(得分:0)

确保在调用CreateProcess时使用完整的绝对路径,因为服务运行时的工作目录可能不是您认为的那样(我犯了这个错误的次数比我多“我想承认。”

如果使用以下简单的内容替换批处理文件,请查看行为是否更改:

@echo TESTING >C:\batch_debug.txt

这样可以更好地了解批处理文件是否完全没有执行,或者批处理文件中是否存在导致问题的内容。

您从CreateProcess获得了什么样的回报值?如果失败,GetLastError会给你任何有用的信息吗?

<强>更新 我认为这里的问题是CreateProcess仅限于可执行文件。您可以启动批处理文件,但必须将其作为参数传递给cmd.exe。您还必须与可执行文件名称分开列出参数。例如,如果命令cmd.exe /c C:\my_batch.bat通常在新的命令解释器实例中运行批处理文件,则以下CreateProcess调用应该执行相同的操作:

CreateProcess("cmd.exe", "/c C:\\my_batch.bat", ...);

答案 2 :(得分:0)

Go to run->services.msc->right click on the service ->properties->
logon->check enable     service to interact with desktop-make it enable