Вызов пакетного файла из службы Windows - PullRequest
0 голосов
/ 16 марта 2011

У меня есть служба, которая должна вызывать пакет, когда новый файл копируется в каталог. Я пытался использовать CreateProcess, ShellExecute, ShellExecuteEx и даже system. Я попытался вызвать пакет напрямую, затем вызвать cmd.exe и передать /c batchfile в качестве параметра ... Ничего. Я установил сервис для запуска от имени администратора. Я пробовал с другими пользователями. Ничего.

Это сервер Windows 2008.

Есть идеи? Спасибо.

Ответы [ 3 ]

0 голосов
/ 16 марта 2011

Убедитесь, что вы используете полный, абсолютный путь при вызове CreateProcess, поскольку рабочий каталог, когда служба запущена, может не соответствовать вашим ожиданиям (я делал эту ошибку чаще, чем хотел бы признаться).

Посмотрите, изменится ли поведение, если вы замените командный файл чем-то простым, например:

@echo TESTING >C:\batch_debug.txt

Это должно дать более четкое представление о том, не выполняется ли пакетный файл вообще или что-то в пакетном файле вызывает проблему.

Какое возвращаемое значение вы получаете от CreateProcess? Если это не помогло, GetLastError даст вам полезную информацию?

UPDATE: Я думаю, что проблема в том, что CreateProcess ограничен исполняемыми файлами. Вы можете запустить командный файл, но вы должны передать его в качестве параметра cmd.exe. Вы также должны перечислить параметры отдельно от имени исполняемого файла. Например, если команда cmd.exe /c C:\my_batch.bat обычно запускает ваш командный файл в новом экземпляре интерпретатора команд, следующий вызов CreateProcess должен сделать то же самое:

CreateProcess("cmd.exe", "/c C:\\my_batch.bat", ...);
0 голосов
/ 08 июня 2013
Go to run->services.msc->right click on the service ->properties->
logon->check enable     service to interact with desktop-make it enable
0 голосов
/ 16 марта 2011

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 () скажет вам, почему.

Вы упоминаете, что пакетный файл должен выполняться «когда новый файл копируется в каталог».Вы убедились, что код обнаружения работает правильно?Достигнут ли код, пытающийся выполнить командный файл, на самом деле?

Больше контекста определенно было бы полезно.Пожалуйста, опубликуйте соответствующие части командного файла и сервисный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...