Gibt es ein Windows CMD-Äquivalent zur Ausführung der Unix-Shell?

10

Gibt es in Windows eine Entsprechung zu "exec" von Unix Shell? Grundsätzlich muss ich vermeiden, einen neuen Prozess zu forken, damit die Eingabe- / Ausgabepipes sowie die Prozess-ID erhalten bleiben.

Bearbeiten:

Also, hier ist mein Problem. Ich habe einen Prozess A, der ein Skript startet, und dieses Skript endet mit der Ausführung eines Prozesses B. Ich benötige A, um die gesamte Ausgabe von B abzurufen und B durch Beenden des von ihm erzeugten Prozesses (des Skripts) zu beenden. .

Unter Unix execerledigt die Ausführung von B mit diesen Job.

Daniel C. Sobral
quelle
Es gibt kein Äquivalent, zumindest nicht mit Standard-Windows-Befehlen und -Programmen.
John Gardeniers
Wenn Sie versuchen, eine ausführbare Datei anstelle einer anderen Batchdatei auszuführen, gibt es keine (unterstützte / realistische) Möglichkeit, dies zu tun. Eingabe- / Ausgabepipes werden jedoch normalerweise von Anwendungen geerbt, die in einer Batchdatei ausgeführt werden. Wenn Sie beschreiben können, warum Sie dies tun möchten, können wir möglicherweise Alternativen vorschlagen.
Harry Johnston
Prozess A sollte bereits die gesamte Ausgabe von B erhalten, es sei denn, das Skript überschreibt dies. Funktioniert das nicht
Harry Johnston
Es ist möglich, mithilfe der Win32-API zu veranlassen, dass ein untergeordneter Prozess stirbt, wenn der übergeordnete Prozess ausgeführt wird. Es gibt jedoch keine integrierte Befehlszeilenoption AFAIK. Wenn ich Quellcode (für Visual C ++) bereitstelle, können Sie ihn erstellen?
Harry Johnston
@Harry Ich gable das Skript aus Java. Wenn also die Idee besteht, dass Prozess A diese Win32-API verwendet, ist dies wahrscheinlich nicht möglich, obwohl ich für die Mühe dankbar bin. Besser nur zu erklären, dass es nicht möglich ist, und ich werde das als Antwort akzeptieren.
Daniel C. Sobral

Antworten:

7

AFAIK gibt es nicht. Windows fehlt execv(), wie Bash Exec es macht. callfunktioniert zum Aufrufen von Batch-Dateien (einfach, interpretieren Sie die Datei einfach im aktuellen Interpreter, ähnlich dem .Befehl von bash ), jedoch nicht für exes.

Dies macht es unmöglich, Einzeiler-Wrapper-Skripte für Skripte in einer beliebigen Sprache unter Windows zu schreiben. Sie erhalten immer die Meldung "Stapeljob beenden?" Mist auf Strg + C und das Beenden des Batch-Prozesses (nicht mit Strg + C, sagen Task-Manager) wird den untergeordneten Prozess nicht beenden. Ich suche jetzt nach einer C-Vorlagendatei, um diese Umhüllung durchzuführen.

UPDATE: Windows hat zwar _execv()eine POSIX-Kompatibilitätsschicht in MSVCRT, aber AFAIK (hat es nicht getestet) ist nur ein Wrapper, CreateProcesssodass immer ein neuer Prozess erstellt wird und der aktuelle Prozess nicht ersetzt werden kann.

capr
quelle
3

Ich denke, call macht was du willst, aber ich bin mir nicht 100% sicher.

Paweł Brodacki
quelle
4
Wenn Sie eine Batchdatei von einer anderen ausführen möchten, ohne eine neue Instanz von cmd.exe zu starten, ist call die richtige Antwort.
Harry Johnston
1

Sie können einen dynamischen Stapelbefehl erstellen und basierend auf der Ausgabe früherer Vorgänge ausführen. Ich bin nicht sicher, ob dies in Ihrem Fall eine Lösung wäre, aber der folgende Code funktioniert einwandfrei.

SET yourDynamicCommand=SET var=1
%yourDynamicCommand%
ECHO var's value is %var%
Abdo
quelle
das macht nichts wie exec...
Jakuje
-1
  • Batch-Dateien ausführen :call
  • Führen Sie exe-Dateien : Kein Befehl benötigt, rufen sie direkt durch/path/to/exe/something.exe
leonheess
quelle