web-dev-qa-db-ja.com

Windows batファイルで別のプログラムを実行し、子プロセスを作成しない

何かをするためのコミット後フックを備えたSubversionサーバーがあります。

フックスクリプトを待たずに、チェックインをすぐに終了したい。ただし、設計上、Subversionのコミット後フックスクリプトは、すべてのchildプロセスが終了するまで実行されるため、次のようなものを使用します。

another_progを開始します。

フックバットファイルでは役に立たない。

したがって、子プロセスを作成しない、または子プロセスを親から切り離さない、Windowsbatファイルで別のプログラムを実行する方法を知りたいです。

17
zhongshu

質問を解決する方法を見つけ、次のcコードをコンパイルし、exe出力にrunjob.exeという名前を付けてから、フックバットファイルで「runjobanother_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; 
} 
13
zhongshu

同期。 2番目のメモ帳は、最初のメモ帳を閉じるまで起動しません。

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

非同期:最初のメモ帳を閉じていなくても、2番目のメモ帳が起動します。

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

彼が話していることを知っていると仮定すると、私は間違っていて...価値がありません。

19
Corey Trager

実行できるのは、長時間実行されるバッチスクリプトまたはその他の実行可能ファイルを実行するスケジュールされたタスクを作成することです。過去に1回実行するように設定し、実行がスケジュールされなくなったときにタスクを削除するように設定しないでください。次に、Subversionフックスクリプトで、次の行を入力します。

schtasks /run /tn NameOfYourTaskHere

スケジュールされたタスクでNotepad ++を実行し、Notepad ++実行可能ファイルが、schtasksコマンドを実行したcmd.exeウィンドウではなく、svchost.exeの子として表示されることをテストで確認しました。

7
jasonh

使用する:

start cmd /c "your command"

乾杯。

5
OJ.

cmd /c "your command"をお試しください

1
lsiu

Windowsタスクスケジューラのコマンドラインインターフェイス「schtasks/run」を使用して、「another_prog」を実行するジョブを開始できますか?事前にジョブを作成する必要があります。また、Windows(NT)リソースキットを備えた「SOON」プログラムがあり、「AT」コマンドスケジューラの動的エントリを作成して、事前にジョブを設定する必要のない数分でジョブを実行していました。それでも少し検索するだけで見つけることができます。

1
SqlACID

ハイブリッドバッチ/ JScriptファイル(つまり、埋め込みJScriptを実行できるバッチファイル)を作成できます。このファイルでは、JScript部分がデタッチモードで実行されますanother_progShell.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));`
0
dlauzon