我正在使用这样的命令行字符串运行MATLAB:

C:\\matlab.exe -nodisplay -nosplash -nodesktop -r"run('C:\\mfile.m');"

m文件包含plot()函数,用于在x-y平面上绘制简单曲线。

m文件成功运行并使用我在上面指定的命令行字符串绘制绘图。 但是,每次我运行该命令时,都会在绘图中显示一个名为" MATLAB Command Window"的窗口。

如何使此" MATLAB命令窗口"不出现,以便仅显示绘图。

" MATLAB命令窗口"如下所示:


如果生成隐藏图形(h = figure(visibility,off);),它会弹出吗?

跑:

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服务,则可能会弹出一个交互式服务检测对话框窗口,并且/ s或/ x选项在Windows Server 2003或2008中不起作用。)

这不能解决问题;命令窗口仍将打开,仅最小化

或者我们可以使用Win32 :: OLEs功能来设置visible = 0,如stackoverflow.com/questions/16244413/中所述

是的,这正是AndrewJanke在上述解决方案中使用COM自动化显示的内容(无论您使用Perl,VB还是MATLAB本身来实例化COM服务器)

远程启动将始终隐藏该窗口,并且永远不可能使其可见:PsExec.exe \

emoteserver -u user -p pass MATLAB.exe wait r"...;quit;"

可能是因为命令窗口是在远程计算机上打开的(这与Unix上的X11转发不同)

在远程计算机上没有打开命令窗口,我尝试使用发送消息或密钥或ROT方法,但没有一个可以使它可见。想知道也许有些调试器可以通过提供输入命令来控制它,并获取其输出以进行调试...

也许您需要指定:psexec -i ...运行交互式会话,或-x远程显示它。在此处查看开关的完整列表

好的,我只是在本地尝试过,它可以工作:psexec -x matlab -nodesktop -wait -r"plot(rand(100,1)); print -dpng out.png; exit"。没有窗口将是可见的。您应该将其放在上面的答案中:)

实际上,该窗口已发送到Winlogon桌面(没有人登录时显示的屏幕)。阅读此博客文章以了解更多信息:waynes-world-it.blogspot.com/2008/05/

你真机智!在远程服务器上使用-i和我的会话ID以及该Blog方法,我们可以显示窗口:PsExec.exe i 1 s \

emoteserver cmd c c:\Progra~1\Debugg~1\PsExec.exe accepteula i 1 s MATLAB.exe wait r"enableservice(AutomationServer,true);try; cd ...;...catch;end;"

谢谢@弗兰克。我想我正试图在不显示本地计算机上的窗口的过程中做相反的事情(不涉及远程)。毕竟,这就是上面的问题所要解决的问题...对于后代,您介意编辑您的答案并解释这些内容,然后我会否投票:)这绝对是隐藏命令窗口的有用方法

我在Windows Server 2003和2008中进行了测试,本地/ i 0即使在会话0中也将隐藏该窗口。/x或/ s选项不起作用。远程只能使用/ i 0 / e或/ e,第一个将显示会话0中的窗口,第二个则不显示。我也根据您的建议修改了本地计算机的答案。

很棒+1。 我只在本地WinXP上进行了测试; i 0选项实际上将在当前会话中显示该窗口,而x选项将其发送到对当前用户隐藏的Winlogon会话。 请注意,x不适用于远程服务器,仅适用于本地。 我应该提到,WinXP安全模型要轻松得多,因此,没有UAC对话框或类似的东西,尽管不确定新的Windows版本:)

因此,从Vista开始,情况已经发生了一些变化,并且会话0现在与用户应用程序隔离了。 现在,所有服务都在这里运行,而用户桌面则在会话1上运行。

如果您是通过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调用,因此在完成查看之前它不会消失。

安德鲁-我正在尝试与您联系并提出建议,但是我在任何地方都找不到您的电子邮件。您能在gmail dot com的altmany上ping我吗? - 谢谢

好消息!

只需一点Java操作,就可以!正常启动MATLAB(使用桌面等),现在运行setDesktopVisibility(false)并瞧!例如。

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

AFAIK使用matlab.exe选项无法在Windows上执行此操作。如果您确实需要隐藏它,我建议您使用MATLAB Engine来显示您的图形。另外,如果它是用于简单的事情,例如绘图等,则可以使用GNU Octave,它可以处理M个文件,并且不像MATLAB那样具有"命令窗口"(它在Windows命令提示符中运行,并且隐藏起来并不难) 。

那很聪明。感谢分享。

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

您可能可以在命令行中以如下方式使用它:

-r"com.mathworks.mde.desk.MLDesktop.getInstance.closeCommandWindow; run('C:\\mfile.m');"

它没有任何区别。

@hk:我没有从命令行尝试过它,但是从MatLab内部它肯定可以在我的系统上运行。您使用的是哪个版本的MatLab?

@BenVoigt:这将关闭MATLAB IDE中的"命令提示符"。用户正在从OS命令行运行MATLAB,并希望隐藏弹出我们的MATLAB窗口。据我所知,你不能...

" -nodesktop"开关可能与此冲突,因为最小的命令窗口与MLDesktop控制的Desktop IDE中的命令窗口不同。 OP,尝试在不使用" -nodesktop"的情况下运行它,可能会很好地工作。如果您希望这些图可见,则也应该删除" -nodisplay"。我认为它在Windows上已被忽略,但由于其目的是抑制图形,因此它是多余的,并且可能引起误解。