我对 Windows 一点也不熟悉,但我确信你应该看看this https://github.com/erlang/otp/blob/maint/lib/kernel/src/os.erl#L188。这是实施os:cmd/1
功能。
有问题的是os:cmd/1
。此函数不会让您知道命令执行是否成功,因此您只需依赖某些命令 shell 行为(取决于平台)。
我建议你使用erlang:open_port/2
功能。像这样的东西:
my_exec(Command) ->
Port = open_port({spawn, Command}, [stream, in, eof, hide, exit_status]),
get_data(Port, []).
get_data(Port, Sofar) ->
receive
{Port, {data, Bytes}} ->
get_data(Port, [Sofar|Bytes]);
{Port, eof} ->
Port ! {self(), close},
receive
{Port, closed} ->
true
end,
receive
{'EXIT', Port, _} ->
ok
after 1 -> % force context switch
ok
end,
ExitCode =
receive
{Port, {exit_status, Code}} ->
Code
end,
{ExitCode, lists:flatten(Sofar)}
end.
所以功能my_exec/1
将返回进程退出代码与进程标准输出一起。