Windows Bat 파일에서 다른 프로그램 실행을하고 자식 프로세스를 생성하지 않습니다.
-
20-09-2019 - |
문제
나는 무언가를 할 수있는 소통 후 후크가있는 Subversion Server가 있습니다.
곧 체크인이 끝나고 싶습니다. 후크 스크립트를 기다리지 마십시오. 그러나 디자인에 의해, 커미션 후 후크 스크립트는 모두까지 실행됩니다. 어린이 프로세스 종료.
다른 _prog 시작 ...
후크 배트 파일에서는 아무 소용이 없습니다.
따라서 Child Process를 생성하지 않거나 아동 프로세스가 부모와 분리되지 않는 Windows Bat 파일에서 다른 프로그램을 실행하는 방법을 알고 싶습니다.
해결책 2
내 질문을 해결하고 다음 C 코드를 컴파일하고 Exe 출력을 runjob.exe로 명명 한 다음 후크 배트 파일에서 "runjob onerdo ever_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.robvandanderwoude.com/ntstart.php
편집하다: 다음 주석은 원래 포스터 인 @zhongshu에 의해 다른 곳에서 이루어졌습니다. 여기에만 복사하고 있습니다.
SVN 이후 CMD /C는 작동하지 않습니다. SVN 포스트 커밋 후크가 후크 및 Hook Exit에서 생성 된 하위 프로세스를 기다리기 때문에 작동하지 않습니다. SVN의 디자인입니다. 해결책을 찾았습니다. 참조하십시오. http://svn.haxx.se/users/archive-2008-11/0301.shtml
그가 자신이 말하는 것을 알고 있다고 가정하면, 나는 틀렸다.
당신이 할 수있는 것은 배치 스크립트 또는 오랫동안 실행되는 기타 실행 파일을 실행하는 예정된 작업을 만드는 것입니다. 과거에 한 번 실행되도록 설정하고 더 이상 실행이 예정되지 않은 경우 작업을 삭제하도록 설정하지 마십시오. 그런 다음 Subversion Hook 스크립트에서 다음 줄을 넣습니다.
schtasks /run /tn NameOfYourTaskHere
예정된 작업을 실행하여 메모장 ++를 실행하여 테스트를 확인했으며 메모장 ++ 실행 파일이 CMD.exe 창이 아닌 SVCHOST.EXE의 자식으로 표시되었습니다. schtasks
명령.
사용:
start cmd /c "your command"
건배.
노력하다 cmd /c "your command"
Windows Task Scheduler 명령 줄 인터페이스 "Schtasks /Run"을 사용하여 "Other_Prog"를 실행하는 작업을 시작할 수 있습니까? 당신은 미리 작업을 만들어야합니다. 예전에는 "AT"명령 스케줄러에 대한 동적 항목을 생성하는 Windows (NT) 리소스 키트가있는 "곧"프로그램이 있었는데 몇 분 안에 작업을 미리 설정할 필요가없는 작업을 실행할 필요가 없었습니다. 약간의 검색으로 여전히 찾을 수 있습니다.
jscript 부품이 실행되는 하이브리드 배치/JScript 파일 (즉, 임베디드 JScript를 실행할 수있는 배치 파일)을 만들 수 있습니다. 또 다른 _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));`