列出Matlab中的所有环境变量
Posted
技术标签:
【中文标题】列出Matlab中的所有环境变量【英文标题】:List all environment variables in Matlab 【发布时间】:2013-11-15 15:47:29 【问题描述】:如何在 Matlab 中获得所有已定义环境变量的列表?我知道getenv
,但您必须提供一个名称,而doc getenv
在如何使用它以任何其他方式检索项目方面没有提供任何帮助。我在网上找不到任何其他相关信息。这甚至可能吗?
我对独立于平台的答案(或至少是 Windows 和 Linux)感兴趣。
【问题讨论】:
【参考方案1】:你可以使用
system('env')
在 linux/mac 上,以及
system('set') % hope I remember correctly, no windows at hand
在这两种情况下,您都必须解析输出,因为它的格式为variable=<variable-value>
。
【讨论】:
我修复了引号,并且按预期工作。老实说,列出变量及其值可能是一件好事,所以这工作得相当好。我仍然很好奇是否有一种真正独立于平台的方式,但由于环境变量相当依赖于平台,这可能会尽可能好。 您也可以在 MATLAB 控制台窗口中使用!env
。就像附加提示一样。【参考方案2】:
下面是一个函数,它实现了两种检索所有环境变量的方法(两种方法都是跨平台的):
-
在 MATLAB 中使用 Java 功能
使用系统特定的命令(如@sebastian 建议的那样)
注意:正如@Nzbuu 在 cmets 中解释的那样,使用 Java 的 System.getenv()
有一个限制,即它返回在 MATLAB 进程启动时捕获的环境变量。这意味着以后在当前会话中使用setenv
所做的任何更改都不会反映在Java 方法的输出中。基于系统的方法不受此影响。
getenvall.m
function [keys,vals] = getenvall(method)
if nargin < 1, method = 'system'; end
method = validatestring(method, 'java', 'system');
switch method
case 'java'
map = java.lang.System.getenv(); % returns a Java map
keys = cell(map.keySet.toArray());
vals = cell(map.values.toArray());
case 'system'
if ispc()
%cmd = 'set "'; %HACK for hidden variables
cmd = 'set';
else
cmd = 'env';
end
[~,out] = system(cmd);
vars = regexp(strtrim(out), '^(.*)=(.*)$', ...
'tokens', 'lineanchors', 'dotexceptnewline');
vars = vertcat(vars:);
keys = vars(:,1);
vals = vars(:,2);
end
% Windows environment variables are case-insensitive
if ispc()
keys = upper(keys);
end
% sort alphabetically
[keys,ord] = sort(keys);
vals = vals(ord);
end
例子:
% retrieve all environment variables and print them
[keys,vals] = getenvall();
cellfun(@(k,v) fprintf('%s=%s\n',k,v), keys, vals);
% for convenience, we can build a MATLAB map or a table
m = containers.Map(keys, vals);
t = table(keys, vals);
% access some variable by name
disp(m('OS')) % similar to getenv('OS')
【讨论】:
是的,这个版本更干净,可能更独立于平台。我总是忘记 Matlab 中的 Java 技巧! Java 实际上给出了与getenv
和setenv
不匹配的不同结果。见gist.github.com/Nzbuu/7c657a3b22f535eb41dc55e12e4440da。
@Nzbuu 有两点需要注意:1)System.getenv
返回启动 MATLAB 进程时的环境变量(JVM 嵌入在 MATLAB 中),这解释了为什么它没有从 @ 获取更改987654333@。这与产生新进程的system
不同 2) cmd.exe
shell 有一些默认情况下不显示的私有变量(MS-DOS 时代遗留下来的)。一个技巧是将执行的命令更改为cmd = 'set "';
以枚举它们,请参阅***.com/q/10431689/97160、blogs.msdn.com/b/oldnewthing/archive/2010/05/06/10008132.aspx 了解更多信息。
最后一个 hack (set + space + doublequote) 实际上是一个成为功能的错误 :) blogs.msdn.microsoft.com/oldnewthing/20140425-00/?p=1143
@Nzbuu:完成。我还将这两种方法组合成一个辅助函数(system
based-one 是默认值)以上是关于列出Matlab中的所有环境变量的主要内容,如果未能解决你的问题,请参考以下文章