Gibt es eine Möglichkeit, starten Sie ein terminal-Fenster (oder cmd bei Windows) und pass/einen Befehl ausführen?

Frage

Ist es möglich, den folgenden zu tun?

  • öffnen Sie eine neue cmd.exe oder terminal (auf MacOS /Linux) Fenster

  • pass /einen Befehl ausführen, z.B. cd <path>

Problem

Kann ich öffnen, cmd mit diesem Befehl:

"$electron.shell.openItem('cmd.exe')"

Aber shell.openItem nicht erlaubt, die übergabe von Argumenten “ /“ – Befehle.


Versuchte ich mit child_process aber ich konnte nicht damit es funktioniert überhaupt nicht, öffnen Sie ein neues terminal-Fenster:

const { spawn, exec } = require('child_process');
spawn('C:/Windows/System32/cmd.exe');

Ich habe auch versucht, den folgenden Befehl ausführen, aber immer noch nichts:

spawn( 'cmd.exe', [ '/c', 'echo ASDASD' ], { stdio: [0, 1, 2] } )

Ist die einzige mögliche Lösung, die ich sehe, ist das erstellen einer command.bat:

start cmd.exe /K "cd /D C:\test"

Und verwenden Sie dann openItem:

"$electron.shell.openItem('command.bat')"

Aber das würde nur funktionieren, auf Windows

  • Ich lese es, aber wie ich bereits erwähnt habe, konnte ich nicht machen, es öffnet sich eine neue cmd.exe / terminal Fenster und übergeben ein argument. Wie mache ich das?
  • ja, ich habe gemerkt, my bad. Ich dachte, es geht lediglich um die Argumenten
  • Ist der Anschluss wichtig? Denn Sie können die verschiedenen Funktionen innerhalb child_process Befehle ausführen jedenfalls so, es sei denn, Sie benötigen spezifische Umgebung einer shell, dann Sie können ausführen beliebigen binary sonst
  • Mir scheint, dass Sie nicht sehen cmd.exe knallen bc Sie nicht Rohr stdio. Versuchen Sie, diese spawn( 'cmd.exe', [ '/c', 'echo ASD' ], { stdio: [0, 1, 2] } ) Es nicht die Konsole öffnen, in neuem Fenster obwohl.
  • Ich bin versucht zu implementieren, die die „öffnen in terminal“ – Funktionalität, so dass Benutzer öffnen könnte, ausgewählten Pfad im terminal. Aber kann ich einen Befehl ausführen, innerhalb child_process laufen C\\Windows\\System32\\cmd.exe und starten Sie die cmd.exe Fenster?
  • hmm, danke für den Befehl, aber immer noch nichts. Ich kann sehen, dass die childProcess Objekt, wenn ich die Konsole.melden Sie Ihren Befehl, aber es immer noch nicht ein neues Fenster öffnen

InformationsquelleAutor Un1 | 2018-05-24



2 Replies
  1. 1

    Hier ist ein funktionierendes Beispiel zeigen, wie man öffnen Sie ein Terminal-Fenster in einem bestimmten Pfad (~/Desktop zum Beispiel) auf macOS von einem renderer-Skript:

    const { app } = require ('electron').remote;
    const atPath = app.getPath ('desktop');
    const { spawn } = require ('child_process');
    let openTerminalAtPath = spawn ('open', [ '-a', 'Terminal', atPath ]);
    openTerminalAtPath.on ('error', (err) => { console.log (err); });

    Sollte es einfach sein, um eine Anpassung an jede gewählte atPath…
    Für die Ausführung anderer Befehle, ich habe nicht einen Weg gefunden, noch…

    Und hier ist das äquivalent funktionierenden code für Linux Mint Cinnamon oder Ubuntu:

    const { app } = require ('electron').remote;
    const terminal = 'gnome-terminal';
    const atPath = app.getPath ('desktop');
    const { spawn } = require ('child_process');
    let openTerminalAtPath = spawn (terminal, { cwd: atPath });
    openTerminalAtPath.on ('error', (err) => { console.log (err); });

    Bitte beachten Sie, dass der name der terminal-Anwendung kann unterschiedlich sein, abhängig von der Linux-Geschmack (zum Beispiel 'mate-terminal' auf Linux Mint MATE), und auch, dass Sie den vollständigen Pfad zu der Anwendung kann explizit definiert werden, um auf der sicheren Seite:

    const terminal = '/usr/bin/gnome-terminal';

    HTH…

    • Danke für die Antwort, ich habe die Lösung gefunden wie man es unter Windows auch! Danke!!!
    • open -a Terminal ist nicht das öffnen eines neuen Terminal-Fenster. Es scheint, dass, wenn die Klemme bereits offen ist, macht es nichts. Mit open -a Terminal --new öffnet sich ein komplett neues Terminal-Instanz (und stellt alle zuvor geöffneten Fenster) das ist nicht das, was ich will. Grundsätzlich möchte ich öffnen Sie ein neues terminal-Fenster-Registerkarte.
  2. 4

    Lösung

    Schließlich fand ich einen Weg, es zu tun auf Windows:

    var child_process = require('child_process');
    child_process.exec("start cmd.exe /K cd /D C:/test");

    Hinweise

    • Müssen Sie die word – start öffnen Sie ein neues Befehlsfenster
    • Statt cd /D C:/test Sie können geben Sie einen beliebigen anderen Befehl, z.B. python
    • /D ist, um sicherzustellen, es wird sich ändern, wird das aktuelle Laufwerk automatisch, abhängig von den angegebenen Pfad

    • /K entfernt die erste Nachricht

    • Nicht verwenden execSync sperrt sich die app, bis das terminal (Befehl
      Eingabeaufforderung“) Fenster geschlossen ist

    Als für MacOS, sieht aus wie ist es möglich, mit osascript

    osascript -e 'tell application "Terminal" to activate' -e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down'

    • Dies funktioniert aber nicht sterben, wenn der parent-Prozess funktioniert – es läuft. Ich brauche es, um die Ausfahrt mit den Eltern.
    • In MacOS Mojave, dass osascript Befehl löst eine Warnung aus, dass „diese app möchte Ihren computer Steuern“. Akzeptieren Sie die Warnung immer noch nicht den Befehl. Es scheint, dass Sie müssen manuell öffnen Sie die Sicherheitseinstellungen und setzen Sie die app Steuern zu können.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.