[英]Calling a batch file from a windows service
我有一項服務,需要在將新文件復制到目錄時調用批處理。 我嘗試使用CreateProcess
, ShellExecute
, ShellExecuteEx
甚至system
。 我嘗試直接調用批處理,然后調用cmd.exe
並將/c batchfile
作為參數傳遞...什么都沒有。 我將服務設置為以管理員身份運行。 我嘗試了其他用戶。 沒有。
這是Windows 2008服務器。
有任何想法嗎? 謝謝。
Go to run->services.msc->right click on the service ->properties->
logon->check enable service to interact with desktop-make it enable
如下面的示例(大致簡化)所示, 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", ...);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.