electron程序,如何通过process.argv从命令行读取参数?
发布于 作者:苏南大叔 来源:程序如此灵动~在使用很多exe
的时候,都有可能碰到:可以传递特殊参数以定制某项功能的情况。比如各大浏览器一般都有类似的设定。或者命令行里面,常见的mv
/cp
之类的命令,也都是可以传递参数的。那么,对于使用electron
技术生成的程序来说,如何才能获得这些额外传递的参数呢?这就是本文中,苏南大叔所描述的内容。
本文测试环境:win10
/electron@3.0
。electron-builder
打包方式。
标准答案
获取这些参数的方法就是process.argv
,但是只有主进程中获取到的process.argv
,才包含有外部传递的参数信息。在渲染进程中,同样使用process.argv
得到的数据,却得到的其它一系列莫名其妙的东西。所以,对于主进程和渲染进程来说,两者的process
并不是同样的一个东西。
注意:从process.argv
数组中,根据是否是生产模式,第X个数据开始,才是你所需要的数据。
思路一
所以,思路就是:在主进程中获得这些额外附加参数,如果想在渲染进程中使用的话,就再使用sharedObject
进行数据共享。
main.js
:
global.sharedObject = {
argv: process.argv
}
在渲染进程中,使用下面的方式读取想要的process.argv
。
var remote = require('electron').remote;
var arguments = remote.getGlobal('sharedObject').argv;
console.log(arguments);
思路二
还可以直接在渲染进程里面通过remote
获得process.argv
。
const remote = require('electron').remote
console.log(remote.process.argv)
对比说明
因为渲染进程里面也是可以获得process.argv
的,那么这里,苏南大叔把主进程中的process.argv
和渲染进程中的process.argv
进行对比。大家就可以发现,还真的是不一样。
调用方式
下面的是个可能的参数调用方式:
electron . aaa bbb ccc ddd eee=fff
为了证明生成的exe
,也是能够接受参数的。苏南大叔,这边使用了electron-builder
进行了打包。然后在命令行里面进行了参数传递,仍然是可以获得相关参数的。
electron-quick-start-win32-x64/electron-quick-start.exe aaa bbb ccc ddd eee=fff
特别提示
下面是两点特别注意的事项:
数组角标
从上面的截图中,这里可以看到:拿到的process.argv
数组中,在调试的情况下,二号角标开始,才是正常的数据。而在生产模式下,一号角标开始,就是正常数据。所以,您需要把拿到的process.argv
数组再做点加工,才拿得到正常的数据。比如:
调试模式:
process.argv.splice(2)
生产模式:
process.argv.splice(1)
是否是生产模式三目运算(是不是被打包成了可执行程序):
process.argv.splice(app.isPackaged ? 1 : 2)
nodeIntegration
因为是使用sharedObject
进行了数据共享,所以BrowserWindow
的nodeIntegration
一定不能设置为false
。这一点前往要注意。下面代码的设置方式是错误的!
错误的设置方式示意:
mainWindow = new BrowserWindow({
webPreferences:{
nodeIntegration:false
}
})
相关文章
总结
主进程通过process.argv
可以获得目标数据,得到的是个数组,从第三个成员开始,就是所需要的数据。为了在渲染进程中使用process.argv
,必须开启nodeIntegration
。但是,渲染进程中的process.argv
和主进程中的process.argv
得到的值,却是不同的值。那么,这样的话,就需要通过sharedObject
进行数据共享。
更多苏南大叔的electron
经验文章,请点击下面的链接查看:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
好啦 也是一样的原理 感谢
我想要双击快捷方式的时候读取其中的--name参数 可以实现吗
应该可以
问个问题,如何让electron调用其他的app.asar或者app文件夹由他启动?
你想调用别人的程序的话,可以。你说调用别人的app.asar,估计不行,触发你复制过来替换自己。或者你调用另外的app.asar所在的exe,不就可以了么。