我想出了一個辦法做到這一點,我也這樣做了詹金斯Matlab的界面窗口。
基本思想是,你將使用日記命令,但後來尾部的文件,但如果你打開多個matlab實例,因爲會有名稱衝突,你需要一個聰明的方式殺死tail命令。所以我使用的方法是命名文件log.txt,其中使用的PID是MATLAB打開時使用的PID。
有一個在MATLAB無證功能,可以讓你得到它的PID。所以,現在,批處理文件和MATLAB都知道PID,而無需讀取/寫入隨機文本文件,這會在執行多個作業時變得雜亂無章。所以你使用它作爲你的唯一標識符。MATLAB還使用MATLAB的tail -f來殺死尾部-f以使批處理文件死亡並且由MATLAB使用與進程調用相關聯的命令行細節找到,因爲它再次使用唯一PID日誌文件名。
這使用了一些wmic命令,需要Windows Vista/7或更高版本。對於XP,您可能必須更加努力才能獲得進程ID,但應該仍然有可能。
這裏是做什麼:
1)獲得Windows GNU AWK:http://gnuwin32.sourceforge.net/packages/gawk.htm
2)獲取從Windows資源工具包tail.exe:http://www.microsoft.com/en-us/download/details.aspx?id=17657
3)確保尾和awk (窗口資源工具包,我不認爲會自動將它們放在路徑中)
3)創建一個名爲matlabrun.bat的批處理文件,如下所示(注意:您需要@echo off,也可以整個命令是相當長,向右滾動..)
@echo off
wmic process call create "c:\matlab\bin\win64\matlab.exe -r \"cd('c:\jenkins\workspace\test'); workdir=pwd; outpath=[pwd '\output'] ; try; run('C:\MATLAB\work\test_run'); end; quit; \" " | findstr ProcessId | awk "{print $3}" | awk -F";" "{ print $1 }"
4)創建一個名爲run.bat中另一個批處理文件:
for /f %%i in ('matlabrun.bat') do (
echo MATLAB Log... > log%%i.txt
tail -f log%%i.txt
set logfilename=log%%i.txt
goto next
)
:next
del /f %logfilename%
5)run.bat文件將執行matlabrun.bat以來-wait沒有通過,matlab將立即返回到命令行並執行tail -f命令。這將阻止批處理文件完成,直到您將其殺死。 matlabrun.bat返回matlab的PID。 6)另一個重要的注意事項:因爲您正在使用「wmic process create」,它將爲您提供一個MATLAB正在使用的PID,但將默認爲c:\ windows \ system32的工作目錄。所以這就是我將工作目錄傳遞給matlab的原因。 wmic process create還有一點特別的地方,你需要在你的命令字符串中加入哪些參數才能運行。所以在命令字符串中使用逗號似乎有問題。所以我建議不要使用這些,或者想出如何逃避它們(可能是^,可行,但我只是在我的matlab運行命令中刪除了我的逗號)。
6)「test_run.m」文件包含以下代碼以寫入正確的日誌文件並殺死正確的尾部-f實例。
matlabpid=feature('getpid');
filename=['log',num2str(matlabpid),'.txt'];
filenamefull=[workdir,'\',filename];
diary(filenamefull);
disp('Script starting...')
%%% put your code here %%%
disp('Script completed...');
diary off;
%%% FIND PID of tail.exe and kill it
%%% by using the name of the log file in the process command line
[a,b]=dos(['wmic process get Commandline,ProcessId']);
C=textscan(b,'%s','delimiter','\n');C=C{1};
for jj=1:size(C,1),
if strfind(C{jj},filename),
D=textscan(C{jj},'%s');D=D{1};
dos(['taskkill /f /pid ',D{4}]) %kills tail.exe which is the log watcher
break
end
end
7)你做的run.bat啓動它。它會去執行matlab,然後在MATLAB實時運行時開始拖尾輸出。然後完成後它將刪除日誌文件。
8)我的目錄結構/文件是在這些位置(我使用的win7 64位):
C:\詹金斯\工作空間\測試\ tail.exe
C:\詹金斯\工作區\測試\ awk.exe
C:\詹金斯\工作空間\測試\ matlabrun.bat
C:\詹金斯\工作空間\測試\的run.bat
C:\ MATLAB \工作\ test_run .m
C:\ MATLAB \ BIN \ Win64的\ matlab.exe
如果使用的是32位MATLAB,點它win32目錄。要獲得正確的PID,您需要在win32或win64目錄中指定實際的matlab.exe二進制文件。
與此處的討論類似:http://stackoverflow.com/questions/37830871/how-to-get-matlab-output-in-jenkins-console –