Unix shell의 exec와 동등한 Windows CMD가 있습니까?


9

Windows에서 Unix Shell의 "exec"에 해당하는 것이 있습니까? 기본적으로 프로세스 ID뿐만 아니라 입력 / 출력 파이프가 보존되도록 새 프로세스를 포크하지 않아야합니다.

편집하다:

자, 여기 내 문제가 있습니다. 스크립트를 시작하는 프로세스 A가 있고이 스크립트는 프로세스 B를 실행하여 종료됩니다 .A는 B의 모든 출력을 가져오고 생성 된 프로세스 (스크립트)를 종료하여 B를 죽일 수 있어야합니다. .

Unix에서 B를 사용하여 실행 exec하면 해당 작업이 수행됩니다.


최소한 표준 Windows 명령 및 프로그램을 사용하지 않는 것은 없습니다.
John Gardeniers

다른 배치 파일이 아닌 실행 파일을 실행하려는 경우 (지원 / 현실적인) 방법이 없습니다. 그러나 입 / 출력 파이프는 일반적으로 배치 파일에서 실행되는 응용 프로그램에 의해 상속됩니다. 원하는 이유를 설명 할 수있는 경우 대안을 제안 할 수 있습니다.
Harry Johnston

스크립트가이를 무시하지 않는 한 프로세스 A는 이미 모든 B의 출력을 가져와야합니다. 작동하지 않습니까?
Harry Johnston

Win32 API를 사용하여 상위 프로세스가 종료 될 때 하위 프로세스가 종료되도록 할 수 있지만 기본 제공 명령 행 옵션 AFAIK는 없습니다. 소스 코드 (Visual C ++ 용)를 제공하면 빌드 할 수 있습니까?
Harry Johnston

@Harry 저는 Java에서 스크립트를 포크하고 있으므로 프로세스 A가 해당 Win32 API를 사용하는 것이 좋으면 노력해 주셔서 감사하지만 작동하지 않을 것 같습니다. 그것이 불가능하다는 것을 설명하는 것이 더 좋으며, 나는 그것을 대답으로 받아 들일 것입니다.
Daniel C. Sobral

답변:


7

AFAIK는 없습니다. execv()bash exec가 수행하는 방식 이 Windows에 없습니다 . call배치 파일을 호출하는 데 효과적입니다 (쉬운, 현재 인터프리터에서 bash .명령 과 유사하게 파일을 해석하십시오 ) .exe에는 적합하지 않습니다.

이로 인해 Windows의 모든 언어에서 스크립트 용 단일 라이너 래퍼 스크립트를 작성할 수 없습니다. 항상 "배치 작업을 종료 하시겠습니까?"라는 메시지가 나타납니다. Ctrl + C에 쓰레기를 넣고 배치 프로세스를 종료하면 (작업 관리자의 Ctrl + C가 아님) 자식 프로세스가 종료되지 않습니다. 이 래핑을 수행하기 위해 C 템플릿 파일을 찾고 있습니다.

업데이트 : Windows는 _execv()MSVCRT의 POSIX 호환성 계층에 있지만 AFAIK는 테스트하지 않았 CreateProcess으므로 항상 새로운 프로세스를 생성하므로 현재 프로세스를 대체 할 수 없습니다.


2

나는 전화 가 당신이 원하는 것을한다고 생각 하지만 100 % 확실하지 않습니다.


4
cmd.exe의 새 인스턴스를 시작하지 않고 다른 배치 파일을 다른 배치 파일에서 실행하려면 전화가 정답입니다.
Harry Johnston

1

동적 배치 명령을 구성하고 이전 작업의 출력을 기반으로 실행할 수 있습니다. 이것이 귀하의 경우 해결책이 될지 확실하지 않지만 다음 코드는 정상적으로 작동합니다.

SET yourDynamicCommand=SET var=1
%yourDynamicCommand%
ECHO var's value is %var%

이 같은 아무것도하지 않습니다 exec...
Jakuje

-1
  • 배치 파일을 실행 하십시오 .call
  • exe-files 실행 : 명령이 필요하지 않습니다./path/to/exe/something.exe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.