一,批处理Matlab
Step1.编写temp.m例子程序在D盘根目录下,功能将传入的参数写到D:\\Data.txt文件里
function A=temp(n, m)
fid=fopen('D:\\Data.txt','a+');
fprintf(fid,'%d',n);
fprintf(fid,'%d',m);
fprintf(fid,'Hello,Tim\r\n');
fclose(fid)
Step2:编写Matlab命令D:\\run.bat,功能调用运行temp.m文件matlab -nojvm -nodesktop -nosplash -r cd('d:\');temp(1,2)大家一眼就应该看明白格式意义Step3.编写C#调用.bat,运行即可看到D:\\Data.txt文件的生成,查看内部应该有12内容
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
namespace CSharpMatlab
{
class Program
{
static void Main(string[] args)
{
string appName = "D:\\run.bat";//path
Process proc = Process.Start(appName);
proc.WaitForExit();
}
}
}
二,批处理R语言Step1:编写.R示例程序Kriging.R,意思就是输出所有的传入变量
Args <- commandArgs()
for (i in 1:length(Args))
{
print(Args[i])
}
Step2:编写下面是我处理程序时用的批处理代码Run.bat:这里只对R的格式进行介绍,--slave是不显示缓存输出的意思;<Kriging.R代表输入文件;>1.txt代表输出文件 ;--args代表后面跟的是参数; 带%夹着的是变量,不带的是字符串变量
set FolderPathForPM25=%~dp0PM25
set RegionId=001
set startTime=2013-01-01
set endTime=2013-10-20
set stationNumber=22
set SavePathForPM25=%~dp0Rout\PM25
R --slave <Kriging.R >1.txt --args %RegionId% %stationNumber% %startTime% %endTime% %FolderPathForPM25% %SavePathForPM25% PM25 Lin
Step3:把两个文件放在一个目录下,手动或程序运行.bat,有问题cyb3727@gmail.com
三,注意1.R和Matlab你得先装好吧,这是第一点。2.环境变量Path得设置。检验很简单,在cmd.exe分别输入matlab和R看有无反应,提示没有这个命令,自个加上。不用bat直接cmd:http://www.legalsoft.com.cn/docs/838.html
四.关于程序同步问题
这种批处理传递参数肯定是:
输入:直接写字符串或者传递文件路径
输出:写文件
异步实现:
1.cmd中的命令都是异步的
2.Process Start后肯定是异步的
同步实现:
1.写成.bat,对于普通应用程序Process WaitForExit就会等待现成结束才会继续执行
2.对于需要中间进程实现执行的进程,如我们是启动matlab应用程序去执行.m文件,这时候即使写成.bat,Process WaitForExit,C#也不会等待.m进程结束才执行,
原因很好理解。这个Process不是.m那个process,那么我们如何实现进程同步呢?
方法很简单,但是很通用:所有的文件输出写成一个temp.txt,在文件写完之后修改文件名为如:output.txt,那么C#应用程序只需要判断是否存在output.txt这个程序
就行,有就可以继续往下执行了。但让对于轻量级频繁输出,这个方法就不好了,因为这样频繁文件读写速度堪忧。
Step1.编写temp.m例子程序在D盘根目录下,功能将传入的参数写到D:\\Data.txt文件里
function A=temp(n, m)
fid=fopen('D:\\Data.txt','a+');
fprintf(fid,'%d',n);
fprintf(fid,'%d',m);
fprintf(fid,'Hello,Tim\r\n');
fclose(fid)
Step2:编写Matlab命令D:\\run.bat,功能调用运行temp.m文件matlab -nojvm -nodesktop -nosplash -r cd('d:\');temp(1,2)大家一眼就应该看明白格式意义Step3.编写C#调用.bat,运行即可看到D:\\Data.txt文件的生成,查看内部应该有12内容
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
namespace CSharpMatlab
{
class Program
{
static void Main(string[] args)
{
string appName = "D:\\run.bat";//path
Process proc = Process.Start(appName);
proc.WaitForExit();
}
}
}
二,批处理R语言Step1:编写.R示例程序Kriging.R,意思就是输出所有的传入变量
Args <- commandArgs()
for (i in 1:length(Args))
{
print(Args[i])
}
Step2:编写下面是我处理程序时用的批处理代码Run.bat:这里只对R的格式进行介绍,--slave是不显示缓存输出的意思;<Kriging.R代表输入文件;>1.txt代表输出文件 ;--args代表后面跟的是参数; 带%夹着的是变量,不带的是字符串变量
set FolderPathForPM25=%~dp0PM25
set RegionId=001
set startTime=2013-01-01
set endTime=2013-10-20
set stationNumber=22
set SavePathForPM25=%~dp0Rout\PM25
R --slave <Kriging.R >1.txt --args %RegionId% %stationNumber% %startTime% %endTime% %FolderPathForPM25% %SavePathForPM25% PM25 Lin
Step3:把两个文件放在一个目录下,手动或程序运行.bat,有问题cyb3727@gmail.com
三,注意1.R和Matlab你得先装好吧,这是第一点。2.环境变量Path得设置。检验很简单,在cmd.exe分别输入matlab和R看有无反应,提示没有这个命令,自个加上。不用bat直接cmd:http://www.legalsoft.com.cn/docs/838.html
四.关于程序同步问题
这种批处理传递参数肯定是:
输入:直接写字符串或者传递文件路径
输出:写文件
异步实现:
1.cmd中的命令都是异步的
2.Process Start后肯定是异步的
同步实现:
1.写成.bat,对于普通应用程序Process WaitForExit就会等待现成结束才会继续执行
2.对于需要中间进程实现执行的进程,如我们是启动matlab应用程序去执行.m文件,这时候即使写成.bat,Process WaitForExit,C#也不会等待.m进程结束才执行,
原因很好理解。这个Process不是.m那个process,那么我们如何实现进程同步呢?
方法很简单,但是很通用:所有的文件输出写成一个temp.txt,在文件写完之后修改文件名为如:output.txt,那么C#应用程序只需要判断是否存在output.txt这个程序
就行,有就可以继续往下执行了。但让对于轻量级频繁输出,这个方法就不好了,因为这样频繁文件读写速度堪忧。