我有一个服务,需要调用一个新的文件复制到一个目录时批处理。 我尝试使用CreateProcess
, ShellExecute
, ShellExecuteEx
甚至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