2009-10-08 14 views
14

मेरे पास कुछ करने के लिए पोस्ट-प्रतिबद्ध हुक के साथ सबवर्जन सर्वर है।विंडोज बैट फ़ाइल में एक और प्रोग्राम चला रहा है और बाल प्रक्रिया नहीं बना

मैं जल्द ही चेकइन खत्म करना चाहता हूं, हुक स्क्रिप्ट का इंतजार नहीं करता। लेकिन डिजाइन द्वारा, सबवर्सन बाद प्रतिबद्ध हुक स्क्रिप्ट सभी बच्चे प्रक्रिया से बाहर निकलें जब तक चलेंगे, तो somthing का उपयोग कर की तरह:

हुक बल्ला फ़ाइल में

शुरू another_prog ... कोई फायदा नहीं है।

तो मैं जानना चाहता हूं कि विंडोज बैट फ़ाइल में एक और प्रोग्राम कैसे चलाया जाए, जो बाल प्रक्रिया नहीं बनाती है या बच्चे को माता-पिता से अलग करने की प्रक्रिया नहीं देती है।

+0

आप कर सकते हैं स्पष्ट करें कि आप किस समस्या को हल करने की कोशिश कर रहे हैं? क्या यह वास्तव में मामला है कि सबवर्जन पोस्ट-प्रतिबद्ध हुक सभी प्रक्रियाओं से बाहर निकलने के लिए इंतजार कर रहा है? क्यों cmd ​​/ c startWebLogic.cmd' काम शुरू नहीं करते? – Cheeso

+4

शुरू cmd/c काम नहीं करता है क्योंकि एसवीएन पोस्ट-प्रतिबद्ध हुक हुक के बाहर इंतजार करेगा और ** बच्चे ** प्रक्रिया हुक निकास द्वारा बनाई गई है। यह एसवीएन का डिजाइन है। मुझे एक समाधान मिला है, कृपया देखें: http://svn.haxx.se/users/archive-2008-11/0301.shtml – zhongshu

उत्तर

12

मुझे अपने प्रश्न को हल करने के लिए एक विधि मिली, निम्नलिखित सी कोड संकलित करें और exjob आउटपुट runjob.exe के रूप में नामित करें, और फिर हुक बल्ले फ़ाइल में, "runjob another_prog" का उपयोग करें, अब यह ठीक है।

#include <windows.h> 
#include <stdio.h> 
#include <tchar.h> 
int _tmain() 
{ 
    char * pCmd = ::GetCommandLine(); 
    // skip the executable 
    if (*pCmd++ == L'"') 
    { 
     while (*pCmd++ != L'"'); 
    } 
    else 
    { 
     while (*pCmd != NULL && *pCmd != L' ') 
      ++pCmd; 
    } 

    while (*pCmd == L' ') 
     pCmd++; 

    STARTUPINFO si; 
    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    PROCESS_INFORMATION pi; 
    ZeroMemory(&pi, sizeof(pi)); 

    // Start the child process. 
    BOOL result = CreateProcess 
    ( 
     NULL, // No module name (use command line) 
     pCmd, // Command line 
     NULL, // Process handle not inheritable 
     NULL, // Thread handle not inheritable 
     FALSE, // Set bInheritHandles to FALSE 
     DETACHED_PROCESS, // Detach process 
     NULL, // Use parent's environment block 
     NULL, // Use parent's starting directory 
     &si, // Pointer to STARTUPINFO structure 
     &pi // Pointer to PROCESS_INFORMATION structure (returned) 
    ); 
    if (result) return 0; 

    char msg[2048]; 
    FormatMessage 
    ( 
     FORMAT_MESSAGE_FROM_SYSTEM, 
     NULL, 
     ::GetLastError(), 
     MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT), 
     msg, sizeof(msg), 
     NULL 
    ); 
    fputs(msg, stderr); 
    _flushall(); 

    return -1; 
} 
+0

सही समाधान के लिए लाखों धन्यवाद! कुछ अन्य कार्यक्रम निष्पादित करने के लिए अपना खुद का प्रोग्राम बनाने के लिए अभी भी थोड़ा असहज है। हालांकि, अनुसूचित कार्यों का उपयोग करके 100 गुना बेहतर और इतने पर। Thx thx thx – Honzajscz

+3

यहां स्रोत कोड के संकलित निष्पादन योग्य का एक लिंक है: https://mega.nz/#!u8tD0YAY!OuULXWhzG4VThwLAbkjpRdTfg6XLgxFmmpNP2hnzb1w –

+1

'another_prog' को कमांड लाइन तर्क प्रदान करने के लिए कुछ प्रावधान करने के बारे में कैसे? अन्यथा, मुझे तर्कों के साथ exe invoking के आसपास एक और बैच स्क्रिप्ट लपेटना होगा – evandrix

0

कोशिश cmd /c "your command"

+1

नहीं, cmd/c का कोई उपयोग नहीं है, svn "आपका आदेश" खत्म होने का इंतजार करेगा। – zhongshu

1

आप Windows कार्य शेड्यूलर कमांड लाइन इंटरफेस "schtasks/रन" का उपयोग एक नौकरी है कि "another_prog" चलाता है शुरू करने के लिए कर सकता है? आपको समय से पहले नौकरी बनाना होगा। विंडोज (एनटी) रिसोर्स किट के साथ "सॉन" प्रोग्राम भी होता था जो कुछ मिनटों में नौकरी चलाने के लिए "एटी" कमांड शेड्यूलर के लिए गतिशील प्रविष्टियां बनाएगा, जिन्हें समय से पहले नौकरी स्थापित करने की आवश्यकता नहीं होती है, यह अभी भी एक छोटी खोज के साथ पाया जा सकता है।

3

उपयोग:

start cmd /c "your command" 

चीयर्स।

+0

कई मामलों में आपको "cmd/c" को छोड़ने में सक्षम होना चाहिए (कोरी ट्रागर द्वारा उत्तर देखें) – jdigital

+0

यह विंडोज पर एसवीएन पोस्ट-प्रतिबद्ध हुक के लिए काम नहीं करेगा। यह अभी भी बाल प्रक्रिया को पूरा करने की प्रतीक्षा करेगा। देखें [कोरी ट्रागर का जवाब] (http://stackoverflow.com/questions/1536205/running-another-program-in-windows-bat-file-and-not-create-child-process/1569941#1569941) – truemedia

16

तुल्यकालिक। दूसरा नोटपैड लॉन्च नहीं होगा जब तक आप पहले बंद नहीं करते।

notepad.exe c:\temp\a.txt 
notepad.exe c:\temp\b.txt 

असीमित: दूसरा नोटपैड लॉन्च होगा भले ही आपने पहले बंद नहीं किया हो।

start notepad.exe c:\temp\a.txt 
start notepad.exe c:\temp\b.txt 

शुरू आदेश के बारे में अधिक जानकारी:
http://www.robvanderwoude.com/ntstart.php

संपादित: निम्न टिप्पणी @zhongshu, मूल पोस्टर से कहीं और बनाया गया था। मैं केवल इसे यहाँ प्रतिलिपि बनाई जा रही हूँ:

शुरू cmd/सी काम नहीं करता क्योंकि SVN बाद प्रतिबद्ध हुक हुक और बच्चे प्रक्रिया हुक बाहर निकलने के द्वारा बनाई गई के लिए इंतजार करेंगे। यह एसवीएन का डिजाइन है। मैं एक समाधान पाया है, कृपया देखें: http://svn.haxx.se/users/archive-2008-11/0301.shtml

मान लिया जाये कि वह जानता है कि वह किस बारे में बात कर रहा है, मैं गलत हूँ और ... अयोग्य।

5

आप क्या कर सकते हैं एक अनुसूचित कार्य है जो बैच स्क्रिप्ट या अन्य निष्पादन योग्य को लंबे समय तक चलाता है। इसे एक बार चलाने के लिए सेट करें, अतीत में और कार्य को हटाने के लिए इसे सेट न करें जब कोई और रन निर्धारित नहीं होता है।

schtasks /run /tn NameOfYourTaskHere 

मैं अपने निर्धारित कार्य रन नोटपैड ++ और Notepad ++ निष्पादन योग्य होने से एक परीक्षण के साथ पुष्टि की svchost.exe का एक बच्चा, नहीं cmd ​​के रूप में दिखाई: तो फिर अपने सबवर्सन हुक लिपि में, निम्न पंक्ति डाल दिया।exe खिड़की है कि मैंने schtasks आदेश से निष्पादित किया।

+0

यह काम करता है खिड़कियों पर एसवीएन पोस्ट प्रतिबद्ध के लिए वास्तव में अच्छा है। हम एक पावरहेल स्क्रिप्ट का उपयोग कर रहे थे जिससे svn को किसी भी प्रतिबद्धता के साथ एक उल्लेखनीय देरी हुई। अब निर्धारित कार्य के साथ, प्रतिबद्धता तुरंत समाप्त होती है और कार्य पृष्ठभूमि में निष्पादित होता है। 'schtasks/run/tn NameOfTask' यहां सबसे अच्छा समाधान है। – truemedia

0

आप एक संकर बैच/JScript फ़ाइल बना सकते हैं (यानी एक बैच फ़ाइल एम्बेडेड JScript चलाने के लिए सक्षम) जहां JScript हिस्सा shell.Run(prog, 0, false) साथ अलग मोड में another_prog चलेंगे:

@if (@X)==(@Y) @end /* JScript comment 
    rem put any batch code that runs before another_prog here 
    @cscript //E:JScript //nologo "%~f0" "another_prog" 0 false 
    rem put any batch code that runs after another_prog here 

    exit /b %errorlevel% 
@if (@X)==(@Y) @end JScript comment */ 

var ARGS = WScript.Arguments; 
var shell = new ActiveXObject("WScript.Shell"); 
shell.Run(ARGS.Item(0),ARGS.Item(1),ARGS.Item(2));` 
संबंधित मुद्दे