除非您之前 运行 octave(-gui)(或 "run octave-cli.exe with qt"),否则由 bat 脚本调用的 octave-gui 不起作用

octave-gui invoked by bat script does not work unless you run octave(-gui) before (or "run octave-cli.exe with qt")

我想 运行 octave-gui(Octave 5.1 随安装程序一起安装,"C:\Octave\mingw64\bin" 在路径变量中)脚本 运行 通过 Windows Task Scheduler。我必须 运行 octave-gui 因为我想使用 qt 工具包来绘制不支持的八度音阶(没有 gui)。因此我通常使用简单的 bat 文件,如 "octave-gui --no-gui c:\path\myfile.m".

但问题是我无法通过单击 Windows 资源管理器或从命令行 运行ning 来 运行 这个 bat 文件。即使是内容为 "octave-gui --no-gui" 的最简单的 bat 文件也会给我以下错误:

但有趣的是我可以让它以某种方式工作:

  1. 打开命令行
  2. 运行 "octave" 或 "octave-gui" 和 close/quit 它
  3. 然后我可以从命令行中获取 bat 文件

但这不是解决方案,对吗?这仅适用于(交互式)命令行。它在任务计划程序中如何工作?

那么,对于 运行 使用 octave-gui 或使用 qt 工具包的 octave 的批处理文件,你有解决方案吗?

这是 Gerhard 提出的 "where" 的解决方法:

命令 octave 在技术上不正确。

它只能在您的命令提示符 window 下工作,因为它的扩展名 .bat 列在分配给未修改的环境变量 %PATHEXT% 的值中。它还假设在您的环境变量 %PATH% 下列出的任何目录中的任何地方都没有名为 octave.comoctave.exe 的其他文件。此外,它还假定调用时在当前目录中不存在名为 octave 且任何扩展名在 %PATHEXT% 下列出的可执行文件。

为了安全起见,您应该改用 octave.bat

octave.bat

Octave.bat 将解析任何输入参数,设置所需的环境,然后 运行 如果检测到 --no-guistart octave-gui.exe --gui %*octave-cli.exe %*输入参数之一。

此外,当 运行 从另一个批处理文件(在本例中 start_my_octave_script.bat),如果你想控制 return,你应该 Call 它之后,几乎可以肯定会是这样。

call octave.bat <command line options>

如果您对 %PATHEXT% 环境变量未修改或至少保持默认值感到满意,则可以省略 .bat 扩展名,但请牢记之前的建议。

call octave <command line options>

感谢 Compo 的提示,我做了一个解决方法。在我看来,必须在 "octave.bat" 中完成解决方案,所以我做到了。我制作了一个副本并将其命名为 "octave-gui-nogui-withqt.bat" 并删除了所有 gui 检查内容,只有 运行 "octave-gui.exe --no-gui"(向下滚动):

:; # if running from bash, recall using cmd.exe
:; cmd.exe //c "[=10=]" "$@"; exit $?
@echo off
Rem   Find Octave's install directory through cmd.exe variables.
Rem   This batch file should reside in Octaves installation bin dir!
Rem
Rem   This trick finds the location where the batch file resides.
Rem   Note: the result ends with a backslash.
set OCT_HOME=%~dp0\.\..\
Rem Convert to 8.3 format so we don't have to worry about spaces.
for %%I in ("%OCT_HOME%") do set OCT_HOME=%%~sI

Rem   Set up PATH.  Make sure the octave bin dir comes first.

set PATH=%OCT_HOME%qt5\bin;%OCT_HOME%bin;%PATH%

Rem   Set up any environment vars we may need.

set TERM=cygwin
set GNUTERM=wxt
set GS=gs.exe

Rem QT_PLUGIN_PATH must be set to avoid segfault (bug #53419).
IF EXIST "%OCT_HOME%\qt5\bin\" (
  set QT_PLUGIN_PATH=%OCT_HOME%\qt5\plugins
) ELSE (
  set QT_PLUGIN_PATH=%OCT_HOME%\plugins
)

Rem set home if not already set
if "%HOME%"=="" set HOME=%USERPROFILE%
if "%HOME%"=="" set HOME=%HOMEDRIVE%%HOMEPATH%
Rem set HOME to 8.3 format
for %%I in ("%HOME%") do set HOME=%%~sI

Rem   Start Octave (this detaches and immediately returns).
Rem make this call in order to have qt on the cli
octave-gui.exe --no-gui %*

这是最优雅的吗?我想上游 Octave 应该允许一个新选项,如“--no-gui-but-use-qt”或类似选项。你怎么看? 令我困惑的是 "octave-cli.exe" 和 "octave-gui.exe" 除了可见的 gui 之外还有更多差异。