当我从命令行运行m文件时,如何隐藏“MATLAB命令窗口”?

6
我正在使用以下命令行字符串运行MATLAB:
C:\ <一个很长的路径>\ matlab.exe -nodisplay -nosplash -nodesktop -r“ run('C:\<一个很长的路径>\ mfile.m');”
m文件包含一个plot()函数,用于在x-y平面上绘制简单曲线。
使用我指定的命令行字符串成功运行m文件并绘制图形。 但是,每次运行此命令时,都会出现一个名为“MATLAB命令窗口”的窗口,同时显示绘图。
如何使此“MATLAB命令窗口”不出现,以便仅可见绘图。
“MATLAB命令窗口”如下所示: enter image description here

如果你创建一个隐藏的图形 (h = figure('visibility','off');),它会弹出吗? - André Caron
4个回答

3
如果您想在Windows上从另一个程序中运行Matlab,可以使用Matlab COM自动化服务器来运行它。该ActiveX控件具有Visible属性,可让您使命令窗口不可见,但似乎会将绘图保留可见状态。
以下是使用另一个Matlab作为控制器的示例。
ml = actxserver('Matlab.Application');
ml.Visible = false;
ml.Execute('surf(peaks)');

或者在VBScript中。

Set ml = CreateObject("Matlab.Application")
ml.Visible = false
ml.Execute("surf(peaks)")
ml.Execute("pause(4)")

这种交互模式可能更适合你的工作流程,具体取决于你的工作流程结构。这样可以启动一次Matlab进程并在其上进行多个绘图请求,节省启动成本,让你能够同时看到多个绘图。
如果你仍想从命令行调用它,请通过上面的VBScript代码运行一个.vbs包装脚本,但是请调用`run('...\mfile.m')`而不是`surf(peaks)`。你的mfile.m将需要一些GUI逻辑,使其在用户解除绘图之前阻塞,并替换`pause`调用,以便在用户完成查看之前不会消失。

Andrew - 我想和你联系商议一个提议,但是我无法找到您的电子邮件。您可以在altmany at gmail dot com上ping我吗?- 谢谢 - Yair Altman

3

好消息!

通过一些Java操作,这是可能的!正常启动MATLAB(带有桌面等)。现在运行setDesktopVisibility(false)就可以了!例如:

setDesktopVisibility(false);
mesh(rand(10));
pause;
setDesktopVisibility(true);

据我所知,使用matlab.exe选项在Windows上无法完成此操作。如果您确实需要隐藏它,建议使用MATLAB引擎来显示您的图形。此外,如果只是简单的绘图等操作,您可以使用GNU Octave,它可以使用M文件并且没有像MATLAB那样的“命令窗口”(它运行在Windows命令提示符中,隐藏它并不难)。

很聪明,谢谢分享。 - Chris

3

运行:

matlab -automation -wait -r "cd \'...\';..."

该功能将在用户会话中显示一个最小化的窗口。根据Amro的建议,我们可以将最小化的窗口本地发送到winlogin会话,这样即使我们看不到最小化的窗口也能使用。

psexec /i 0 matlab -nodesktop -wait -r "plot(rand(100,1)); print -dpng out.png;quit" >null 2>&1

这段代码将文件保存到C:\Windows\System32目录下,如果启用了ISD服务,可能会弹出交互式服务检测对话框窗口。在Windows Server 2003或2008中无法使用/s或/x选项。


或者我们可以使用Win32 :: OLE的visible = 0设置功能,如http://stackoverflow.com/questions/16244413/can-win32ole-be-used-in-parallel-to-start-multiple-instance-of-matlab中所述。 - Frank
远程机器上没有打开命令窗口,我尝试使用发送消息或按键,或者ROT方法,但都无法使其可见。想知道是否有一些调试器可以通过提供输入命令并获取其输出来控制它,以进行调试目的... - Frank
也许您需要指定:psexec -i ... 来运行交互会话,或者使用 -x 来远程显示它。请在此处查看开关的完整列表。 (http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx) - Amro
1
你真是太有才了!使用-i和我的会话ID在远程服务器上,以及那个博客方法,我们可以显示窗口:PsExec.exe /i 1 /s \\remoteserver cmd /c c:\Progra~1\Debugg~1\PsExec.exe /accepteula /i 1 /s MATLAB.exe /wait /r "enableservice('AutomationServer',true);try; cd '...';...catch;end;" - Frank
根据 这篇文章 的说明,从Vista开始,情况发生了一些变化,会话0现在与用户应用程序隔离开来。现在所有的服务都运行在那里,而用户桌面则在会话1及以上运行。 - Amro
显示剩余9条评论

1
com.mathworks.mde.desk.MLDesktop.getInstance.closeCommandWindow

你可以通过命令行使用它:

-r "com.mathworks.mde.desk.MLDesktop.getInstance.closeCommandWindow; run('C:\<a long path here>\mfile.m');"

1
没有任何区别。 - hkBattousai
@hk:我没有尝试在命令行中运行它,但是在MatLab内部它在我的系统上确实可以工作。你使用的MatLab版本是什么? - Ben Voigt
1
@BenVoigt:这将关闭MATLAB IDE中的“命令提示符”。用户正在从操作系统命令行运行MATLAB,并希望隐藏弹出的MATLAB窗口。据我所知,你不能... - Amro
“-nodesktop”开关可能与此冲突,因为最小化的命令窗口与MLDesktop控制的桌面IDE中的窗口不同。OP,请尝试在没有“-nodesktop”的情况下运行它,这样很可能会起作用。如果您打算显示绘图,则应该删除“-nodisplay”;我认为它在Windows上被忽略了,但它是多余的,并且可能会误导,因为它的目的是抑制图形。 - Andrew Janke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接