#输入输出与重定向
PowerShell 把命令的输出分为多个流(stream),并用不同的 Write-* 命令写入。理解数据流与重定向,有助于控制信息显示在哪里、是否写入文件,以及如何屏蔽不需要的输出。
#输出命令
| 命令 | 用途 |
|---|---|
Write-Output | 向管道输出对象,是默认的输出方式 |
Write-Host | 直接写入主机显示,主要用于交互提示 |
Write-Verbose | 输出详细过程信息,默认不显示 |
Write-Warning | 输出警告信息 |
Write-Error | 输出错误信息,默认不终止脚本 |
> Write-Output '普通输出'
> Write-Host '显示在主机上'
> Write-Verbose '仅在启用详细输出时显示'
> Write-Warning '磁盘空间不足'
> Write-Error '处理失败'
Write-Output的结果可以继续传给管道中的下一个命令。Write-Host的输出不会进入成功流,因此不能被赋值或通过管道处理;从 PowerShell 5 起它写入信息流。Write-Verbose需要配合-Verbose或$VerbosePreference = 'Continue'才会显示。Write-Error默认是非终止错误,可用-ErrorAction Stop转为终止错误。
#重定向
PowerShell 使用与常见 Shell 类似的重定向符号:
> Get-Process > processes.txt
> Get-Process >> processes.txt
> Get-ChildItem missing 2> error.txt
> Get-Process *> all.txt
> Get-ChildItem missing 2>&1
>把成功流写入文件,覆盖原有内容。>>追加到文件末尾。2>只写入错误流。*>把所有流写入同一个文件。2>&1把错误流合并到成功流,便于统一处理。
流编号如下:
| 编号 | 流 |
|---|---|
1 | 成功输出 |
2 | 错误 |
3 | 警告 |
4 | 详细 |
5 | 调试 |
6 | 信息 |
因此 3> 可以单独保存警告,6> 可以捕获 Write-Host 写入的信息流。
#Out-File
Out-File 提供比重定向更明确的参数:
> Get-Process | Out-File -FilePath processes.txt
> Get-Process | Out-File -FilePath processes.txt -Append
> 'text' | Out-File -FilePath note.txt -Encoding utf8
-Append追加而不是覆盖。-Encoding指定编码,常用值有utf8、utf8NoBOM、ascii。- 在 PowerShell 7 中,
>和Out-File默认使用 UTF-8。
#Tee-Object
Tee-Object 在把结果写入文件或变量的同时,仍将结果保留在管道中:
> Get-Process | Tee-Object -FilePath processes.txt | Select-Object -First 3
> Get-Process | Tee-Object -Variable procs | Measure-Object
#丢弃输出
$null 是一个特殊变量,把输出重定向到它即可丢弃:
> Start-Process pwsh > $null
> $null = Get-Process