【问题标题】:Electron Windows Production Bundle Command Line ArgumentsElectron Windows Production Bundle 命令行参数
【发布时间】:2021-07-07 15:25:30
【问题描述】:

我正在 macOS 上使用 electron-builder 构建一个 Electron 应用程序。

在我的代码中,我像这样访问命令行参数:

const cmd = electron.remote.app.commandLine;

const val = cmd.hasSwitch('myArg')
        ? cmd.getSwitchValue('myArg')
        : undefined;

在提供参数时,这适用于 macOS 上的生产构建:

./my-electron-app.app/Contents/MacOS/my-electron-app --myArg=foo

// or:
open my-electron-app.app --args -myArg=foo

但在 Windows 上我无法正常工作。

这是我尝试使用cmd.exe

my-electron-app.exe --myArg=foo
my-electron-app.exe -myArg=foo
my-electron-app.exe /myArg=foo
my-electron-app.exe myArg=foo

当记录 electron.remote.process.argv[1] 时,我可以在 macOS Windows 上看到传递的参数,但是 hasSwitchgetSwitchValue 不会给我这个值。

我做错了什么?或者有没有更好的方法让跨平台命令行参数正常工作?

【问题讨论】:

  • 起初,这告诉我您可能传递了一个 URL/路径之类的参数,该参数在 Windows 中被剥离,并且会询问特定的参数(请参阅this issue),但我会预计 arg 也会从 process.argv 中删除..所以我想这是别的东西
  • 我刚刚在我的 Windows 机器上尝试过,将 "-abc=foo" 传递到 VSCode 的 launch.json "args" 属性中,app.commandLine.hasSwitch("abc") 正确返回 true。我没有在任何地方使用电子生成器。不确定这是否相关。我没有从源代码运行我的应用程序的打包版本。
  • 不是this,是吗?看起来很相似,但不确定为什么它会在 Mac 上工作
  • @pushkin 感谢您的评论。是的,我想传递一个路径作为参数 (C:\...),但是 传递一个像 foo 这样的字符串也不起作用。我刚刚再次检查了my-electron-app.exe -myArg=foo 将在electron.remote.process.argv 中显示-myArg=foo...我只是做了一些额外的调试,结果如下:hasSwitch('myArg)`返回falsegetSwitchValue('myArg')返回""。我从上面尝试了所有 4 个版本:双/单破折号、斜杠、无前缀。

标签: windows electron command-line-arguments electron-builder


【解决方案1】:

我猜这是因为你的开关中的大写字母。见this已关闭问题:

这是故意的。 hasSwitch API 是 Chromium CommandLine 类的直接包装器,它的行为是故意的。

来自Chromium source

开关名称必须小写。

虽然我还不完全清楚为什么 Mac 没有遇到同样的问题。

【讨论】:

  • 谢谢!我会尝试使用所有小写字母并会报告
  • 成功了!使用全小写时,它可以完美运行。似乎 Chromium 甚至并不关心您是否在参数前面使用双破折号、单破折号或斜杠。我想在开关名称中使用破折号也是允许的,但我还没有测试过。
猜你喜欢
  • 2019-08-15
  • 1970-01-01
  • 2012-04-10
  • 2010-09-09
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 2014-12-07
  • 2011-04-05
相关资源
最近更新 更多