19

I have subversion server with a post-commit hook to do something.

I want the checkin finish soon, not wait the hook script. But by design, the Subversion post-commit hook script will run until all child process exit, so using somthing like:

start another_prog...

in the hook bat file has no use.

So I want to know how to run another program in Windows bat file which not create child process or let the child process detach from the parent.

4

7 に答える 7

22

同期。最初のメモ帳を閉じるまで、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

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

于 2009-10-15T02:00:58.803 に答える
14

私は自分の質問を解決する方法を見つけ、次の 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; 
} 
于 2009-10-17T13:20:44.570 に答える
8

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

schtasks /run /tn NameOfYourTaskHere

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

于 2009-10-15T21:49:33.137 に答える
6

使用する:

start cmd /c "your command"

乾杯。

于 2009-10-12T02:18:05.137 に答える
1

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

于 2009-10-12T01:59:04.610 に答える
1

Try cmd /c "your command"

于 2009-10-08T07:43:19.987 に答える
0

shell.Run(prog, 0, false)を使用して JScript 部分がanother_progをデタッチ モードで実行するハイブリッド バッチ/JScript ファイル (つまり、埋め込み JScript を実行できるバッチ ファイル) を作成できます。

@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));`
于 2017-03-08T20:27:21.433 に答える