تشغيل برنامج آخر في ملف Windows Bat وعدم إنشاء عملية فرعية

StackOverflow https://stackoverflow.com/questions/1536205

سؤال

لدي خادم تخريب مزود بخطاف ما بعد الالتزام للقيام بشيء ما.

أريد الانتهاء من تسجيل الوصول قريبًا، وليس انتظار نص الخطاف.ولكن حسب التصميم، سيتم تشغيل البرنامج النصي لخطاف Subversion بعد الالتزام حتى الكل طفل خروج العملية، وذلك باستخدام شيء مثل:

ابدأ برنامج_آخر...

في ملف الخفافيش هوك لا فائدة منه.

لذلك أريد أن أعرف كيفية تشغيل برنامج آخر في ملف Windows Bat الذي لا ينشئ عملية فرعية أو يسمح للعملية الفرعية بالانفصال عن الأصل.

هل كانت مفيدة؟

المحلول 2

لقد وجدت طريقة لحل سؤالي، وتجميع كود c التالي وتسمية مخرج exe باسم 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; 
} 

نصائح أخرى

متزامن.لن يتم تشغيل المفكرة الثانية إلا بعد إغلاق الأولى.

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، الملصق الأصلي.أنا فقط أنسخها هنا:

لا تعمل START CMD /C لأن خطاف SVN بعد الالتزام سوف ينتظر الخطاف وعملية الطفل التي تم إنشاؤها بواسطة مخرج الخطاف.إنه تصميم SVN.لقد وجدت الحل، يرجى الرجوع إلى: http://svn.haxx.se/users/archive-2008-11/0301.shtml

على افتراض أنه يعرف ما يتحدث عنه، فأنا مخطئ و... غير مستحق.

ما يمكنك فعله هو إنشاء مهمة مجدولة تقوم بتنفيذ البرنامج النصي الدفعي أو أي ملف قابل للتنفيذ آخر يتم تشغيله لفترة طويلة.قم بتعيينه ليتم تشغيله مرة واحدة في الماضي ولا تقم بتعيينه لحذف المهمة عندما لا تتم جدولة عمليات تشغيل أخرى.ثم في البرنامج النصي لربط Subversion، ضع السطر التالي:

schtasks /run /tn NameOfYourTaskHere

لقد تأكدت من خلال الاختبار من خلال تشغيل المهمة المجدولة لبرنامج Notepad ++ وظهر الملف القابل للتنفيذ Notepad ++ كتابع لـ svchost.exe، وليس نافذة cmd.exe التي قمت بتنفيذها schtasks أمر من.

يستخدم:

start cmd /c "your command"

هتافات.

يحاول cmd /c "your command"

هل يمكنك استخدام واجهة سطر أوامر برنامج جدولة مهام Windows "schtasks /run" لبدء مهمة تقوم بتشغيل "another_prog"؟سيكون عليك إنشاء الوظيفة في وقت مبكر.كان هناك أيضًا برنامج "SOON" مع مجموعة أدوات Windows (NT) التي من شأنها إنشاء إدخالات ديناميكية لبرنامج جدولة الأوامر "AT" لتشغيل مهمة في بضع دقائق لا تتطلب إعداد مهمة مسبقًا، لا يزال من الممكن العثور عليه مع القليل من البحث.

يمكنك إنشاء ملف دفعي/JScript مختلط (أي.ملف دفعي قادر على تشغيل JScript مضمن) حيث سيتم تشغيل جزء JScript else_prog في وضع منفصل مع shell.Run(prog, 0, false):

@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));`
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top