ZetCode

Dart ProcessResult

最后修改于 2025 年 4 月 4 日

Dart 中的 ProcessResult 类表示运行进程的结果。它提供了对退出代码、标准输出、标准错误和进程信息的访问。

Process.runProcess.runSync 等函数会返回 ProcessResult。它是 Dart 的 dart:io 库的一部分。

基本定义

ProcessResult 是一个包含进程执行结果的不可变对象。它在进程完成时创建,不能被修改。

关键属性包括 exitCode、stdout、stderr 和 pid。这些属性提供了关于进程执行和输出的完整信息。

ProcessResult 基本用法

此示例演示了基本的进程执行和结果检查。

main.dart
import 'dart:io';

void main() async {
  var result = await Process.run('ls', ['-l']);
  
  print('Exit code: ${result.exitCode}');
  print('Stdout: ${result.stdout}');
  print('Stderr: ${result.stderr}');
}

我们运行 'ls -l' 命令并检查其结果。ProcessResult 对象包含所有执行详情,包括输出流和退出状态。

$ dart main.dart
Exit code: 0
Stdout: total 8
-rw-r--r--  1 user  staff  123 Apr  4 10:00 main.dart

Stderr: 

处理命令错误

此示例演示了使用 ProcessResult 进行错误处理。

main.dart
import 'dart:io';

void main() async {
  var result = await Process.run('grep', ['pattern', 'nonexistent.txt']);
  
  if (result.exitCode != 0) {
    print('Command failed with exit code ${result.exitCode}');
    print('Error output: ${result.stderr}');
  } else {
    print('Output: ${result.stdout}');
  }
}

我们检查 exitCode 以确定命令是否成功。非零退出代码通常表示错误,详细信息可在 stderr 中找到。这种模式对于健壮的进程处理很常见。

$ dart main.dart
Command failed with exit code 2
Error output: grep: nonexistent.txt: No such file or directory

解析命令输出

此示例演示了从 ProcessResult 解析命令输出。

main.dart
import 'dart:io';

void main() async {
  var result = await Process.run('date', ['+%Y-%m-%d']);
  
  if (result.exitCode == 0) {
    var date = (result.stdout as String).trim();
    print('Current date: $date');
  } else {
    print('Failed to get date');
  }
}

我们执行 date 命令并解析其输出。stdout 被转换为 String 并进行修剪以进行干净处理。这演示了如何处理命令输出。

$ dart main.dart
Current date: 2025-04-04

运行多个命令

此示例演示了处理多个命令及其结果。

main.dart
import 'dart:io';

void main() async {
  var commands = [
    ['echo', 'Hello Dart'],
    ['uname', '-a'],
    ['whoami']
  ];
  
  for (var cmd in commands) {
    var result = await Process.run(cmd[0], cmd.sublist(1));
    print('Command: ${cmd.join(' ')}');
    print('Exit code: ${result.exitCode}');
    print('Output: ${(result.stdout as String).trim()}');
    print('---');
  }
}

我们按顺序执行多个命令并处理每个结果。该示例系统地展示了如何处理不同类型的命令及其输出。

$ dart main.dart
Command: echo Hello Dart
Exit code: 0
Output: Hello Dart
---
Command: uname -a
Exit code: 0
Output: Darwin Kernel Version 22.1.0...
---
Command: whoami
Exit code: 0
Output: user
---

处理二进制输出

此示例演示了如何处理进程的二进制输出。

main.dart
import 'dart:io';

void main() async {
  var result = await Process.run('ls', ['-l'], stdoutEncoding: null);
  
  if (result.exitCode == 0) {
    var output = result.stdout as List<int>;
    print('Binary output length: ${output.length} bytes');
    print('First 10 bytes: ${output.take(10)}');
  }
}

通过将 stdoutEncoding 设置为 null,我们获得原始字节而不是字符串。这对于二进制数据处理非常有用。输出可作为 List<int> 获得。

$ dart main.dart
Binary output length: 123 bytes
First 10 bytes: (116, 111, 116, 97, 108, 32, 56, 13, 10, 45)

最佳实践

来源

Dart ProcessResult 文档

本教程通过实际示例介绍了 Dart 的 ProcessResult 类,展示了在 Dart 应用程序中执行进程、处理输出和管理错误的方法。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有超过十年的经验。

列出 所有 Dart 教程