Dart学习笔记(21):获取环境变量及运行外部程序

发表于2018-07-04 17:45 阅读(65)

本篇算是IO文件操作的补充
在写代码的时候,我们经常会用到一些路径或者系统值
也就是常说的环境变量
通常分为系统环境变量和用户环境变量

本文地址:http://www.cndartlang.com/833.html

用户环境变量在Windows下面可以在系统属性中查看
这是用户自己设置的
常用的如:PATH、ANDROID_HOME等

也包含部分系统变量,如:windir、OS等
如果有相同的变量名,系统会先取用户变量、再取系统变量
如:TEMP、PATH等
详细的内容可以在命令行中用set命令查看
(Linux下为env和set命令)

注:
调用Ping的代码在Windwos中运行通过
Linux和Mac中未测试

main.dart

import 'dart:io';
import 'dart:convert';

main() async {
  print("操作系统:${Platform.operatingSystem}");
  print("CPU核数:${Platform.numberOfProcessors}");
  print("文件URI:${Platform.script}");
  print("文件路径:${Platform.script.toFilePath()}\n");

  if(!Platform.isWindows) {
    return;
  }

  //遍历所有环境变量
  Platform.environment.forEach((k, v) {
    print(k + "=" + v);
  });

  /**
   * 这里提一下start的命名可选参数:ProcessStartMode mode,有三个枚举值
   * ProcessStartMode.NORMAL,默认值
   * 新运行的程序作为主程序的子进程,并通过数据流stdin stdout stderr连接通信
   * ProcessStartMode.DETACHED
   * 创建一个独立的进程,与主进程无数据流连接,主进程只能获得子进程的pid
   * 关闭主进程后,对其没有影响
   * ProcessStartMode.DETACHED_WITH_STDIO
   * 创建一个独立的进程,但是与主进程可以通过数据流stdin stdout stderr连接
   *
   * Process.start的特点是可以通过数据流和子进程进行交互
   */

  Process.start("ping", ['www.baidu.com']).then((Process process) {
    // 如果原文有中文等特殊字符
    // 字节列表在转换为String的时候
    // 需要对字节列表进行重新编码
    process.stdout
        .transform(SYSTEM_ENCODING.decoder)
        //print(data)用于输出一行,stdout用于输出接收到的字节串
        .listen((data) => stdout.add(UTF8.encode(data)));
  });

  /**
   * 创建一个子进程,并且父进程和子进程不能交互
   * 之后返回运行结果
   * stdout和stderr默认编码为SYSTEM_ENCODING
   * 可在Process.run的命名可选参数中设置
   */
  Process.run('ping', ['www.cndartlang.com']).then((result) {
    stdout.write(result.stdout);
    stderr.write(result.stderr);
  });
}

运行结果:

操作系统:windows
CPU核数:4
文件URI:file:///E:/DartProject/Note21/main.dart
文件路径:E:\DartProject\Note21\main.dart

#ENVTSLOGRBCSHELLEXT2568=3460864
#ENVTSLOGSSS2568=72185968
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\King\AppData\Roaming
ASL.LOG=Destination=file
ATOM_HOME=C:\Users\King\.atom
CLASSPATH=.;C:\Program Files (x86)\QuickTime\QTSystem\QTJava.zip
COMMONPROGRAMFILES=C:\Program Files\Common Files
COMMONPROGRAMFILES(X86)=C:\Program Files (x86)\Common Files
COMMONPROGRAMW6432=C:\Program Files\Common Files
COMPUTERNAME=OZ
COMSPEC=C:\windows\system32\cmd.exe
FP_NO_HOST_CHECK=NO
GOOGLE_API_KEY=AIzaSyAQfxPJiounkhOjODEO5ZieffeBv6yft2Q
HOMEDRIVE=C:
HOMEPATH=\Users\King
LOCALAPPDATA=C:\Users\King\AppData\Local
LOGONSERVER=\\OZ
NODE_ENV=production
NODE_PATH=C:\Users\King\AppData\Local\atom\app-1.7.3\resources\app.asar\exports
NUMBER_OF_PROCESSORS=4
OS=Windows_NT
PATH=C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;D:\Program Files\ATI Technologies\ATI.ACE\Core-Static;d:\Program Files\Git\cmd;D:\Program Files\WIDCOMM\Bluetooth Software\;D:\Program Files\WIDCOMM\Bluetooth Software\syswow64;C:\Program Files (x86)\QuickTime\QTSystem\;D:\dart\dart-sdk\bin;D:\flutter\bin;D:\ffmpeg\bin
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 37 Stepping 2, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=2502
PROGRAMDATA=C:\ProgramData
PROGRAMFILES=C:\Program Files
PROGRAMFILES(X86)=C:\Program Files (x86)
PROGRAMW6432=C:\Program Files
PROMPT=$P$G
PSMODULEPATH=C:\windows\system32\WindowsPowerShell\v1.0\Modules\
PUBLIC=C:\Users\Public
QTJAVA=C:\Program Files (x86)\QuickTime\QTSystem\QTJava.zip
SESSIONNAME=Console
SHELLLAUNCH{A81BA54B-CCFE-4204-8E79-A68C0FDFA5CF}=ShellExt
SYSTEMDRIVE=C:
SYSTEMROOT=C:\windows
TEMP=C:\Users\King\AppData\Local\Temp
TMP=C:\Users\King\AppData\Local\Temp
USERDOMAIN=OZ
USERNAME=King
USERPROFILE=C:\Users\King
VBOX_MSI_INSTALL_PATH=D:\Program Files\VirtualBox\
WINDIR=C:\windows

正在 Ping www.a.shifen.com [103.235.46.39] 具有 32 字节的数据:
来自 103.235.46.39 的回复: 字节=32 时间=211ms TTL=49
来自 103.235.46.39 的回复: 字节=32 时间=211ms TTL=49
来自 103.235.46.39 的回复: 字节=32 时间=212ms TTL=49
来自 103.235.46.39 的回复: 字节=32 时间=209ms TTL=49

103.235.46.39 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 209ms,最长 = 212ms,平均 = 210ms

正在 Ping www.cndartlang.com [120.24.168.15] 具有 32 字节的数据:
来自 120.24.168.15 的回复: 字节=32 时间=33ms TTL=50
来自 120.24.168.15 的回复: 字节=32 时间=34ms TTL=50
来自 120.24.168.15 的回复: 字节=32 时间=33ms TTL=50
来自 120.24.168.15 的回复: 字节=32 时间=33ms TTL=50

120.24.168.15 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 33ms,最长 = 34ms,平均 = 33ms

注:用户的桌面路径由 %UserProfile%\Desktop 拼接