簡體   English   中英

從Windows服務調用批處理文件

[英]Calling a batch file from a windows service

我有一項服務,需要在將新文件復制到目錄時調用批處理。 我嘗試使用CreateProcessShellExecuteShellExecuteEx甚至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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM