flutter - dart:io 进程 - 如何在 Windows 上运行 'CMD start'?

标签 flutter dart

在 Linux 上,我们可以使用简单的 io.Process 调用打开 url:

io.Process.run("xdg-open", [ url, ])

但尝试在 Windows 上做同样的事情

io.Process.run("开始", [url]);

它失败了: 系统找不到指定的文件。

我猜我们需要 cmd.exe 的路径,它位于 %ComSpec%。尝试执行“echo %ComSpec%”,但出现相同的错误。还尝试对路径进行硬编码,但没有成功。

这是我们的完整功能:

ProcessResult result;
  try {
    if(Platform.isLinux){
      result = await io.Process.run("xdg-open", [ url, ]);
    }
    else if(Platform.isWindows){
      result = await io.Process.run("start", [url]);
    }
  } on ProcessException catch (e){
    Log.e(e?.message);
  };
  return result?.exitCode == 0;

[编辑] 更新标题更准确

最佳答案

您的问题标题与您的代码不符;它不是在尝试运行 cmd.exe,而是在尝试运行名为 start 的可执行文件。它不起作用的原因是 start 不是可执行文件,它是 cmd.exe 解释器中内置的命令。 (尝试在命令提示符下运行 where start;与 where cmd 进行比较。)

如果你想运行cmd.exe命令,比如start,你需要将runInShell: true传递给Process。运行。但是,请记住,如果这样做,您可能需要注意参数中的特殊字符。

(您标题中问题的答案是:Process.run('cmd', [...]);。但是由于您想要做的是在shell 使用 runInShell: true 比使用 /c 调用 cmd 和你的命令作为字符串更容易。)

关于flutter - dart:io 进程 - 如何在 Windows 上运行 'CMD start'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60821479/

相关文章:

flutter - flutter_bloc 库中的存储库提供程序在推送新路由时不提供存储库

flutter - 如何在 Flutter 中更改/添加/编辑 Info.plist

从图库中选择后 flutter 设置图像

flutter - 按下后退按钮时如何在后台发送应用程序

ios - App Store Connect Operation Error 资源下载失败 : com. apple.transporter.mediatoolkit/2.2.0

sorting - Dart自定义排序列表

asynchronous - Flutter中可靠/持久的计时器

android - 尝试在 VSCode 和 Flutter 中调试时突然出现 Gradle 错误

flutter - 仅在图像可见时渲染图像

dart - flutter父组件如何调用子组件?