¿Existe un equivalente CMD de Windows del ejecutivo de shell de Unix?

9

¿Hay algún equivalente en Windows para el "ejecutivo" de Unix Shell? Básicamente, necesito evitar bifurcar un nuevo proceso, de modo que se conserven las tuberías de entrada / salida, así como la identificación del proceso.

Editar:

Entonces, aquí está mi problema. Tengo un proceso A que inicia un script, y este script finaliza ejecutando un proceso B. Necesito que A obtenga toda la salida de B, así como poder matar a B al matar el proceso que ha generado (el script) .

En Unix, ejecutar B con exechace ese trabajo.

Daniel C. Sobral
fuente
No hay equivalente, al menos no usando comandos y programas estándar de Windows.
John Gardeniers
Si está intentando ejecutar un archivo ejecutable, en lugar de otro archivo por lotes, no hay una forma (compatible / realista) de hacerlo. Sin embargo, las tuberías de entrada / salida normalmente son heredadas por las aplicaciones que se ejecutan en un archivo por lotes. Si puede describir por qué quiere hacer esto, podemos sugerirle alternativas.
Harry Johnston
El proceso A ya debería obtener toda la salida de B, a menos que el script anule esto. ¿Esto no funciona?
Harry Johnston
Es posible usar la API Win32 para organizar que un proceso secundario muera cuando el proceso primario lo hace, sin embargo, no hay una opción de línea de comandos AFAIK incorporada. Si proporciono algún código fuente (para Visual C ++), ¿puede compilarlo?
Harry Johnston
@Harry Estoy bifurcando el script de Java, por lo tanto, si la idea es que el proceso A use esa API Win32, me temo que es poco probable que funcione, aunque estoy agradecido por el esfuerzo. Es mejor explicar que no es posible, y lo aceptaré como la respuesta.
Daniel C. Sobral

Respuestas:

7

AFAIK no hay. Windows carece de execv()cómo bash exec lo hace. callfunciona para llamar archivos por lotes (fácil, solo interprete el archivo en el intérprete actual, similar al .comando de bash ) pero no para exes.

Esto hace que sea imposible escribir scripts de envoltura de una línea para scripts en cualquier idioma en Windows. Siempre obtendrá ese "¿Terminar trabajo por lotes?" basura en Ctrl + C y matar el proceso por lotes (no con Ctrl + C, desde el administrador de tareas, por ejemplo) no matará el proceso hijo. Ahora estoy buscando un archivo de plantilla C para hacer este ajuste.

ACTUALIZACIÓN: Windows tiene _execv()en su capa de compatibilidad POSIX en MSVCRT, pero AFAIK (no lo ha probado) es solo una envoltura, por CreateProcesslo que siempre creará un nuevo proceso, no puede reemplazar el proceso actual.

capr
fuente
2

Creo que la llamada hace lo que quieres, pero no estoy 100% seguro.

Paweł Brodacki
fuente
44
Si desea ejecutar un archivo por lotes desde otro, sin iniciar una nueva instancia de cmd.exe, llamar es la respuesta correcta.
Harry Johnston
1

Puede construir un comando por lotes dinámico y ejecutarlo en función de la salida de operaciones anteriores. No estoy seguro de que esta sea una solución en su caso, pero el siguiente código funciona bien.

SET yourDynamicCommand=SET var=1
%yourDynamicCommand%
ECHO var's value is %var%
Abdo
fuente
esto no hace nada como exec...
Jakuje
-1
  • Ejecutar archivos por lotes :call
  • Ejecutar archivos exe : no se necesita comando, llámelo directamente por/path/to/exe/something.exe
leonheess
fuente