有没有办法启动终端窗口(或Windows上的cmd)并传递/运行命令?

时间:2018-05-24 10:54:12

标签: node.js electron

问题

是否可以执行以下操作?

  • 打开一个新的cmd.exeterminal(在MacOS / Linux上)窗口

  • 传递/运行命令,例如cd <path>

问题

我可以通过运行此命令打开cmd:

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

但是shell.openItem不允许传递参数/命令。

我尝试使用child_process,但我根本无法使用它,它没有打开新的终端窗口:

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

我也试过运行以下命令,但仍然没有:

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

我看到唯一可行的解​​决方案是创建command.bat

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

然后使用openItem

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

但这只适用于Windows

2 个答案:

答案 0 :(得分:2)

解决方案

我终于在Windows上找到了一种方法:

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

备注

  • 您必须添加单词start才能打开新的命令窗口
  • 您可以指定任何其他命令,而不是cd /D C:/test,例如python
  • /D是为了确保它会自动更改当前的驱动器,具体取决于指定的路径

  • /K删除了初始消息

  • 不要使用execSync它会锁定应用程序直到终端(命令 提示)窗口已关闭

至于MacOS,看起来可能与osascript

有关

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

答案 1 :(得分:1)

这是一个工作示例,展示如何从macOS在渲染器脚本上打开特定路径(例如〜/ Desktop)的终端窗口:

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); });

应该很容易使它适应任何选定的atPath ...... 至于运行其他命令,我还没找到方法......

以下是Linux Mint CinnamonUbuntu的等效工作代码:

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); });

请注意,终端应用程序的名称可能会有所不同,具体取决于Linux风格(例如'mate-terminal'上的Linux Mint MATE),以及可以显式定义应用程序的完整路径,为了安全起见:

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

... HTH