我有一个服务需要在将新文件复制到目录时调用批处理。我尝试使用CreateProcess
,ShellExecute
,ShellExecuteEx
甚至system
。我尝试直接调用批处理,然后调用cmd.exe
并将/c batchfile
作为参数传递......没有。
我将服务设置为以管理员身份运行。我和其他用户一起试过了。什么都没有。
这是Windows 2008服务器。
有什么想法吗? 谢谢。
答案 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