Windows CMD是否与Unix Shell的exec等效?


9

Windows中有与Unix Shell的“ exec”等效的东西吗?基本上,我需要避免派生一个新进程,以便保留输入/输出管道以及进程ID。

编辑:

所以,这是我的问题。我有一个启动脚本的进程A,此脚本通过执行进程B结束。我需要A来获取B的所有输出,并能够通过杀死它产生的进程来杀死B(脚本) 。

在Unix上,执行B可以exec完成这项工作。


没有等效的功能,至少没有使用标准的Windows命令和程序。
John Gardeniers

如果您要运行的是可执行文件,而不是其他批处理文件,则没有(受支持的/现实的)方法。但是,输入/输出管道通常由在批处理文件中运行的应用程序继承。如果您可以描述为什么要这样做,我们可能会建议其他方法。
哈里·约翰斯顿

进程A应该已经获取了B的所有输出,除非脚本覆盖了它。这不行吗?
哈里·约翰斯顿

可以使用Win32 API安排子进程在父进程执行时死掉,但是没有内置的命令行选项AFAIK。如果我提供了一些源代码(适用于Visual C ++),您可以构建它吗?
哈里·约翰斯顿

@Harry我正在从Java派生脚本,因此,如果想法是让进程A使用该Win32 API,尽管我对此表示感谢,但恐怕不太可能。最好只是解释一下这是不可能的,我将接受它作为答案。
Daniel C. Sobral

Answers:


7

AFAIK没有。Windows缺少execv()bash exec的工作方式。call适用于调用批处理文件(很简单,只需在当前解释器中解释该文件,类似于bash的.命令),但不适用于exe。

这样就不可能在Windows上为任何语言的脚本编写单行包装脚本。您将始终获得“终止批处理作业?” 废除Ctrl + C并杀死批处理进程(任务管理器说不使用Ctrl + C)不会杀死子进程。我现在正在寻找一个C模板文件来进行此包装。

更新:Windows _execv()在MSVCRT中确实具有其POSIX兼容性层,但是AFAIK(尚未对其进行测试)只是一个包装,CreateProcess因此它将始终创建一个新进程,无法替换当前进程。



1

您可以构造动态批处理命令并根据先前操作的输出执行它。我不确定这是否是您的解决方案,但是以下代码可以正常工作。

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

这并没有像exec...
Jakuje

-1
  • 执行批处理文件call
  • 执行exe文件:无需命令,直接通过调用/path/to/exe/something.exe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.