代码之家  ›  专栏  ›  技术社区  ›  Un1

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

  •  4
  • Un1  · 技术社区  · 6 年前

    问题

    是否可以执行以下操作?

    • 打开新的 cmd.exe terminal (在MacOS/Linux上)窗口

    • 通过/运行命令,例如 cd <path>

    问题

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

    "$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')"
    

    但那只能用在窗户上

    2 回复  |  直到 6 年前
        1
  •  1
  •   user8022331    6 年前

    下面是一个工作示例,演示如何在特定路径(例如~/desktop)上打开终端窗口 macOS ,来自渲染器脚本:

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

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

    这里是等效的工作代码 Linux Mint Cinnamon 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); });
    

    请注意,终端应用程序的名称可能不同,这取决于Linux的风格(例如 'mate-terminal' Linux Mint MATE ,并且可以明确定义应用程序的完整路径,以确保安全:

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

    嗯…

        2
  •  4
  •   Un1    6 年前

    解决方案

    我终于在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'