2016-07-01 2 views
2

Unter Windows 7, wenn ich Process_create/3 in SWI Prolog verwendet, um eine Anwendung wie Notepad.exe zu öffnen, wird der Editor geöffnet. Es funktioniert jedoch nicht für Anwendungen, die Eingabeaufforderung verwenden. Als Beispiel, wenn ich versuchte, das Fenster der Eingabeaufforderung zu öffnen, mit:Fehler bei der Verwendung der Eingabeaufforderung oder Shell mit Process_create/3 in SWI Prolog

main :- process_create('C:\\WINDOWS\\system32\\cmd.exe',[] ,[]). 

, die eine ähnliche

ERROR: Process "c:\windows\system32\cmd.exe": exit status: 1 

gibt, wenn es versucht, powershell.exe zu öffnen, es funktioniert auch nicht . Die Konsole hängt einfach, ohne einen Fehler anzuzeigen.

Jede Hilfe wird sehr geschätzt.

+0

Müssen Sie die Anwendung starten, damit Sie sie anstelle des aktuell laufenden Prolog-Programms verwenden? Ohne zusätzliche Argumente wird 'process_create/3' verwendet, um ein nicht interaktives Programm einmal auszuführen. Wenn Sie den Fokus wechseln möchten, sollten Sie sorgfältig alle Optionen durchlesen, die Sie an "process_create/3" übergeben können. –

+0

Von meinem Prolog-Code versuche ich, die Anwendung zu starten, die eine .bat ist, die ein Eingabeaufforderungsfenster startet und darin ausgeführt wird. Sie müssen Argumente übergeben. Jetzt bin ich in der Lage, die Anwendung von meinem Code mit 'win_exec/2' auszuführen und es funktioniert auch (einschließlich der Übergabe von Parametern). Aber ich wollte es mit 'process_create/3' ausführen, indem ich Argumente übergeben habe, indem ich sie in der' Args'-Liste übergebe, wie in der Dokumentation erklärt. Es funktioniert jedoch nicht. Also habe ich versucht, Notepad.exe und cmd.exe zu öffnen, um zu sehen, wie es funktioniert, wie oben erklärt. Irgendeine Idee, wie es funktioniert? Vielen Dank. – shujin

+0

Momentan ist es besser, 'win_exec/2' zu verwenden. Ich benutze Windows nicht, also ist das Beste, was ich tun kann, um Ihnen zu helfen, die Dokumentation sorgfältiger zu lesen als Sie;) aber es scheint, dass 'process_create/3' nicht so nützlich ist wie' win_exec/2' für Windows. Aber nimm mein Wort nicht. –

Antwort

2

, um ein separates Konsolenfenster zu starten:

?- process_create(path(cmd), ['/c', 'start', 'cmd'], []). 

Oder noch kürzer (aber ich weiß nicht, wie tragbar ist dies):

?- process_create(path(cmd), ['/c', 'start'], []). 

Oder auf diese Weise (Idee von SWI- genommen Prolog Quellcode):

?- getenv('COMSPEC', CMD), process_create(CMD, ['/c', 'start'], []). 

Um einen externen BAT-Befehl mit 3 Argumenten zu starten:

?- process_create(
    path(cmd), 
    ['/c', 'start', 'cmd', '/c', 'c:\\test\\test.bat', 'arg1', 'arg2', 'arg3'], 
    []). 

Wichtiger Hinweis: theoretisch Sie all diese Argumente als eine Zeichenfolge übergeben könnten, zum Beispiel. '/c start cmd ...' statt einer Liste von Strings, aber seltsame Dinge können in anspruchsvolleren Fällen passieren. In meinem Fall fügte SWI-Prolog 7.2.3 am Ende ein einfaches Anführungszeichen oder ein einfaches Anführungszeichen hinzu, so dass das letzte an das Batch-Skript übergebene Argument nicht arg3 sondern arg3' oder arg3" war.