何かをするためのコミット後フックを備えたSubversionサーバーがあります。
フックスクリプトを待たずに、チェックインをすぐに終了したい。ただし、設計上、Subversionのコミット後フックスクリプトは、すべてのchildプロセスが終了するまで実行されるため、次のようなものを使用します。
another_progを開始します。
フックバットファイルでは役に立たない。
したがって、子プロセスを作成しない、または子プロセスを親から切り離さない、Windowsbatファイルで別のプログラムを実行する方法を知りたいです。
質問を解決する方法を見つけ、次の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;
}
同期。 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
彼が話していることを知っていると仮定すると、私は間違っていて...価値がありません。
実行できるのは、長時間実行されるバッチスクリプトまたはその他の実行可能ファイルを実行するスケジュールされたタスクを作成することです。過去に1回実行するように設定し、実行がスケジュールされなくなったときにタスクを削除するように設定しないでください。次に、Subversionフックスクリプトで、次の行を入力します。
schtasks /run /tn NameOfYourTaskHere
スケジュールされたタスクでNotepad ++を実行し、Notepad ++実行可能ファイルが、schtasks
コマンドを実行したcmd.exeウィンドウではなく、svchost.exeの子として表示されることをテストで確認しました。
使用する:
start cmd /c "your command"
乾杯。
cmd /c "your command"
をお試しください
Windowsタスクスケジューラのコマンドラインインターフェイス「schtasks/run」を使用して、「another_prog」を実行するジョブを開始できますか?事前にジョブを作成する必要があります。また、Windows(NT)リソースキットを備えた「SOON」プログラムがあり、「AT」コマンドスケジューラの動的エントリを作成して、事前にジョブを設定する必要のない数分でジョブを実行していました。それでも少し検索するだけで見つけることができます。
ハイブリッドバッチ/ JScriptファイル(つまり、埋め込みJScriptを実行できるバッチファイル)を作成できます。このファイルでは、JScript部分がデタッチモードで実行されますanother_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));`