从Windows服务调用batch file

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

这是一个Windows 2008服务器。

有任何想法吗? 谢谢。

如下面的(粗略简化的)例子所示, 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()会告诉你为什么。

您提到批处理文件将被执行“当一个新的文件复制到一个目录”。 你是否证实检测代码工作正常? 试图执行批处理文件的代码是否实际到达?

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

确保您在调用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", ...); 
 Go to run->services.msc->right click on the service ->properties-> logon->check enable service to interact with desktop-make it enable