matlab system函数 如何按顺序运行

在matlab中如何等 system函数运行完成后再继续向下运行?
现状是 system函数启动cmd命令后,会同步执行下行的命令,由于下行未获取到所需数据而停顿。
目标是 想等cmd命令运行完成后,产生所需数据文件后再继续system函数下行的命令。
方法1 实时检测cmd命令产生的数据文件不在增大后,才执行下行命令。如何实时检测?
方法2 实时检测cmd命令启动的仿真软件关闭后,才执行下行命令,如何实时检测某软件已关闭?

示例:
system(cmd命令.cmd);%cmd命令启动其他仿真软件,执行仿真并产生数据文件,数据文件不断增大。
其他命令,比如读取运行cmd命令后产生的数据文件;

注:cmd命令中有2级cmd命令,命令流就是先运行1级命令启动仿真软件A进行相关设置,再运行2级命令启动仿真软件B进行仿真,在2级命令启动仿真软件B后就和matlab同步执行了。

引用 皆我百晓生 小程序回复内容作答:

在MATLAB中,你可以使用system函数来执行外部命令。默认情况下,system函数是同步的,即它会等待外部命令执行完成后再继续向下运行。

以下是两种方法来实现你的目标:

方法1:检测数据文件是否增大
你可以使用dir命令来获取文件的大小信息,并在文件不再增大时继续运行下一条命令。你可以使用一个循环来实时检测文件大小。

cmd = 'your_cmd_command'; % 设置你的cmd命令
system(cmd);

file_path = 'path_to_your_data_file'; % 设置你的数据文件路径
previous_size = 0; % 用于保存上一次的文件大小

while true
    file_info = dir(file_path);
    current_size = file_info.bytes;
    
    if current_size > previous_size
        previous_size = current_size;
        pause(1); % 等待一段时间后再进行下一次检测
    else
        break; % 当文件大小不再增大时,跳出循环,继续执行下一条命令
    end
end

% 在这里继续执行你需要在数据文件生成后运行的代码

方法2:检测仿真软件是否关闭
你可以使用tasklist命令来检测某个进程(例如仿真软件)是否存在。当进程不存在时,表示仿真软件已关闭,可以继续运行下一条命令。

cmd = 'your_cmd_command'; % 设置你的cmd命令
system(cmd);

process_name = 'name_of_your_simulation_software'; % 设置你的仿真软件进程名称

while true
    [~, result] = system(['tasklist /FI "IMAGENAME eq ' process_name '"']);

    if contains(result, process_name)
        pause(1); % 等待一段时间后再进行下一次检测
    else
        break; % 当仿真软件进程不存在时,跳出循环,继续执行下一条命令
    end
end

% 在这里继续执行你需要在仿真软件关闭后运行的代码

请根据你的具体情况选择适合的方法,并根据你的命令和文件路径进行适当的修改。

这是在2021a版本matlab中的测试结果。结论是正常使用system函数是不会同步执行后面命令的。这里以最简单的示例说明这一点。
这是一段使用system函数的用例,第3行代码打开记事本notepad,第4行打印hello
test1.m脚本:

img

执行结果如下,先打开notepad,关闭notepad后打印出hello:

img

img


只有在cmd命令后面加入&符号,才能同步执行下面的命令
test2.m脚本:

img

执行结果如下,打开notepad同时打印hello:

img


由此可见正常使用system函数是不会同步执行后面命令的。


cmd = 'your_cmd_command'; % 设置你的cmd命令
system(cmd);
file_path = 'path_to_your_data_file'; % 设置你的数据文件路径
previous_size = 0; % 用于保存上一次的文件大小
while true
    file_info = dir(file_path);
    current_size = file_info.bytes;
    if current_size > previous_size
        previous_size = current_size;
        pause(1); % 等待一段时间后再进行下一次检测
    else
        break; % 当文件大小不再增大时,跳出循环,继续执行下一条命令
    end
end
% 在这里继续执行你需要在数据文件生成后运行的代码

cmd可以直接同步执行BA

【以下回答由 GPT 生成】

问题优化

问题标题: 如何在Matlab中按顺序运行system函数?

问题标签: 开发语言, Matlab, System函数, 文件监测, 进程监测

问题内容: 我想在Matlab中按顺序运行system函数,并在其中某个命令完成后继续执行下一个命令。

具体来说,我想在使用system函数启动cmd命令后等待其完成后再继续向下运行。目前的问题是,当我使用system函数启动cmd命令后,Matlab会立即执行下面的命令,但由于下面的命令需要获取由cmd命令生成的数据,导致程序阻塞。

我的目标是在cmd命令运行完成后生成所需的数据文件,然后再继续执行下面的命令。我想了解如何实现以下两种方法中的任意一种:

方法1: 实时检测由cmd命令生成的数据文件,只有在数据文件不再增大时才执行下方的命令。我想了解如何实时监测数据文件的增量。

方法2: 实时检测由cmd命令启动的仿真软件何时关闭,只有在仿真软件关闭后才执行下方的命令。我想了解如何实时监测某个软件是否已关闭。

示例:

system('cmd命令.cmd');  % cmd命令启动其他仿真软件,执行仿真并生成数据文件,数据文件不断增大
% 其他命令,如读取由运行cmd命令后生成的数据文件

解决方案

方法1: 实时监测数据文件的增量

为了实时监测数据文件的增量,我们可以使用Matlab的定时器对象(timer)来定期检查文件的大小变化。

步骤: 1. 使用system函数启动cmd命令,并将生成的数据文件路径保存到变量中。 2. 创建一个定时器对象。 3. 设置定时器的定时间隔(例如1秒)和TimerFcn回调函数。 4. 在TimerFcn回调函数中,比较前后两次文件大小,如果大小不再增加,停止定时器,并执行下方的命令。

以下是Matlab代码示例:

% Step 1: 启动cmd命令获取数据文件路径
outputFilePath = '生成的数据文件路径';  % 替换为实际的数据文件路径
system('cmd命令.cmd > outputFilePath');  % 启动cmd命令并将输出重定向到文件

% Step 2: 创建定时器对象
t = timer;

% Step 3: 设置定时器属性
t.TimerFcn = @checkFileSize;  % 设置定时器回调函数
t.Period = 1;  % 定时器间隔,单位为秒
t.ExecutionMode = 'fixedSpacing';  % 设置定时器执行模式为固定间隔

% Step 4: 定义定时器回调函数
function checkFileSize(~,~)
    currentSize = dir(outputFilePath).bytes;  % 获取当前文件大小
    pause(1);  % 等待1秒
    newSize = dir(outputFilePath).bytes;  % 再次获取文件大小
    if newSize == currentSize
        stop(t);  % 文件大小不再增加,停止定时器
        % 执行下方的命令
    end
end

% 启动定时器
start(t);

请根据实际情况替换outputFilePath为生成的数据文件路径。

方法2: 实时监测某个软件是否已关闭

为了实时监测某个软件是否已关闭,我们可以使用Matlab的taskkill命令行工具来检测进程是否存在。

步骤: 1. 使用system函数启动cmd命令,并将其输出重定向到一个临时文件中。 2. 使用Matlab的taskkill命令行工具检测cmd命令启动的进程是否存在。 3. 如果进程不存在,执行下方的命令。

以下是Matlab代码示例:

% Step 1: 启动cmd命令并将输出重定向到临时文件
system('cmd命令.cmd > tempFile.txt');

% Step 2: 检测进程是否存在
while true
    [~, result] = system('tasklist /FI "IMAGENAME eq 仿真软件名称.exe" /FO CSV | findstr "仿真软件名称.exe"');  % 替换为实际的仿真软件名称
    [token, ~] = strtok(result, ',');
    if strcmp(token, '仿真软件名称.exe')  % 替换为实际的仿真软件名称
        pause(1);  % 等待1秒后重新检测进程是否存在
    else
        % 执行下方的命令
        break;
    end
end

请根据实际情况替换仿真软件名称.exe为实际的仿真软件名称。

这样,当仿真软件进程关闭后,下方的命令将会被执行。

希望这些解决方案能对您有帮助。如果您还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

参考gpt:
结合自己分析给你如下建议:
方法1:您可以使用 system 函数的第二个输出参数 cmdout ,它会返回命令的输出,包括任何错误或警告信息。您可以检查 cmdout 中是否包含某些特定的字符串,例如“完成”或“成功”,来判断命令是否执行完毕。例如:

[status,cmdout] = system ( ‘cmd命令.cmd’ ); while ~contains (cmdout, ‘完成’ ) pause (1); % 暂停 1 秒 [status,cmdout] = system ( ‘cmd命令.cmd’ ); % 重新执行命令并获取输出 end % 在此处继续执行其他命令

方法2:您可以使用 tasklist 命令来检查某个进程是否在运行,然后使用 while 循环来等待该进程结束。例如,如果您想要等待 notepad.exe 进程结束,您可以这样写:

[status,cmdout] = system ( ‘tasklist /FI “IMAGENAME eq notepad.exe”’ ); while status == 0 % 如果 status 为 0 ,表示找到了 notepad.exe 进程 pause (1); % 暂停 1 秒 [status,cmdout] = system ( ‘tasklist /FI “IMAGENAME eq notepad.exe”’ ); % 重新检查进程 end % 在此处继续执行其他命令

方法1: 实时检测数据文件是否增大

你可以在MATLAB中使用一个循环来检测数据文件的大小是否在增大。一旦文件大小不再增大,就可以继续执行下行命令。这种方法需要注意设置合适的循环间隔和文件大小检测条件。

cmd = 'your_cmd_command.cmd';  % 替换为实际的命令
system(cmd);  % 启动仿真软件并生成数据文件

% 等待数据文件停止增大
dataFilePath = 'path_to_your_data_file';  % 替换为实际的数据文件路径
previousSize = 0;
while true
    fileInfo = dir(dataFilePath);
    currentSize = fileInfo.bytes;
    
    if currentSize > previousSize
        previousSize = currentSize;
        pause(5);  % 等待5秒后再次检测
    else
        break;  % 文件大小不再增大,跳出循环
    end
end

% 执行下行命令,比如读取数据文件

方法2: 实时检测仿真软件是否关闭

这种方法需要你的仿真软件在运行期间产生一个标志文件,用于表示仿真软件是否在运行。然后,MATLAB可以定期检测该标志文件是否存在,一旦不存在,就表示仿真软件已关闭,可以继续执行下行命令。

cmd = 'your_cmd_command.cmd';  % 替换为实际的命令
system(cmd);  % 启动仿真软件并生成数据文件

% 定期检测仿真软件是否关闭的标志文件
runningFlagPath = 'path_to_running_flag_file';  % 替换为实际的标志文件路径
while isfile(runningFlagPath)
    pause(5);  % 等待5秒后再次检测
end

% 执行下行命令,比如读取数据文件

实时检测数据文件大小

cmd = 'your_cmd_here';
system(cmd);

dataFile = 'path_to_your_data_file';
prevSize = 0;

while true
    currentSize = dir(dataFile).bytes;
    if currentSize > prevSize
        % 数据文件正在增大,继续等待
        prevSize = currentSize;
        pause(1); % 可以根据需要调整等待时间
    else
        % 数据文件大小不再增大,可以继续下一步操作
        break;
    end
end

% 执行其他命令


结合GPT给出回答如下请题主参考
在 Matlab 中,使用 system 函数执行命令时,该函数会立即返回并继续执行下一行代码,因此如果需要等待 system 函数返回,在命令执行完成后再继续向下执行,可以使用下面两种方法:

  1. 使用 wait 命令

wait 命令可以等待指定进程结束后再继续执行下一行命令。可以将 system 函数的返回值作为 wait 命令的输入参数,以等待该进程结束。例如:

sysRetVal = system('cmd命令');
wait(sysRetVal);
  1. 使用 tic 和 toc 命令

可以使用 tic 和 toc 命令来计算命令执行的时间,从而实现等待命令执行完成的效果。例如:

tic;
system('cmd命令');
toc;

在上述代码中,tic 命令用于开始计时,system 函数用于执行命令,然后通过 toc 命令计算时间来等待命令执行的结束。

无论使用哪种方法,都需要保证执行的命令能够在有限的时间内完成,否则程序可能会一直等待命令执行完毕。另外,如果命令执行时产生了大量输出,也可能会导致程序一直等待。因此,在编写程序时需要注意这些问题。

Matlab:函数优先顺序
可以参考下