一行命令,和它背后的 PowerShell 日常
引子:一个很小的麻烦
那天我在排查一个 DSL 图配置,文件在 checkpoint/graph_dsl.json。
我想先看看它长什么样,于是:
- 双击 → 记事本转圈,等了两秒才开;
- 换 VS Code → 窗口启动、加载插件,又等了几秒;
- 在 cmd 里
type checkpoint\graph_dsl.json→ 中文全是乱码。
我只是想看一眼文件内容,结果被工具链拖住了。
最后我在 PowerShell 里敲了一行:
powershell
Get-Content checkpoint/graph_dsl.json -Encoding UTF8
内容干干净净地刷出来,中文正常,没有 GUI,没有等待。
就这一行,解决了三个小问题:
- 不用开编辑器------终端里直接看;
- 不卡------没有 GUI 启动开销;
- 不乱码 ------
-Encoding UTF8明确告诉 PowerShell 按 UTF-8 解析,绕开了系统默认 ANSI(中文环境是 GBK)的坑。
看起来只是"读个文件"。但真正用起来你会发现,这行命令其实是 PowerShell 日常开发的一个入口:它能读,就能解析;能解析,就能处理;能处理,就能串成脚本。
下面是我日常真正高频用到的那部分。
正片:日常高频速查
1. 读文件 / 读 JSON
powershell
Get-Content .\a.txt -Encoding UTF8 # 按行读
$text = Get-Content .\a.json -Raw -Encoding UTF8 # 整文件读,JSON 必用 -Raw
$obj = $text | ConvertFrom-Json # 解析成对象
$obj | ConvertTo-Json -Depth 20 | Set-Content .\out.json -Encoding utf8
Windows PowerShell 5.1 的
Set-Content -Encoding UTF8会带 BOM。对方敏感时用:
powershell[IO.File]::WriteAllText("$PWD\out.json", ($obj | ConvertTo-Json -Depth 20), (New-Object Text.UTF8Encoding $false))
控制台中文乱码先 chcp 65001(只影响显示,不改文件编码)。
2. 路径别手拼
powershell
Join-Path "checkpoint" "a.json"
Test-Path .\a.json -PathType Leaf
New-Item -ItemType Directory -Force "out" | Out-Null
3. 管道四件套
powershell
... | Where-Object { $_.CPU -gt 100 } # 过滤
... | Select-Object Name, Id, CPU # 选字段
... | Sort-Object Length -Descending # 排序
... | Measure-Object Length -Sum # 统计
常用组合:
powershell
Get-ChildItem .\checkpoint -Filter *.json -File -Recurse
Get-ChildItem .\checkpoint -File | Where-Object Length -gt 1MB
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5
4. 进程 / 端口 / 服务
powershell
Get-Process | Where-Object ProcessName -like "*node*"
Stop-Process -Id 12345
Get-NetTCPConnection -LocalPort 8080 -ErrorAction SilentlyContinue
Get-Service | Where-Object Status -eq Running
Restart-Service "服务名" # 需要管理员
5. 错误处理
powershell
$ErrorActionPreference = "Stop"
try { $obj = Get-Content $p -Raw -Encoding UTF8 | ConvertFrom-Json }
catch { Write-Error "读取失败: $($_.Exception.Message)"; throw }
& git status
if ($LASTEXITCODE -ne 0) { throw "git 失败: $LASTEXITCODE" }
6. 函数模板
powershell
function Get-Json {
[CmdletBinding()]
param([Parameter(Mandatory)][string]$Path)
if (-not (Test-Path $Path -PathType Leaf)) { throw "文件不存在: $Path" }
Get-Content $Path -Raw -Encoding UTF8 | ConvertFrom-Json
}
原则:输出对象,不输出字符串 ;提示走 Write-Verbose,运行时加 -Verbose。
7. 调试 / 性能
powershell
$obj | Format-List * # 看结构
$obj | ConvertTo-Json -Depth 5 # 看嵌套
Set-PSBreakpoint -Script .\a.ps1 -Line 20
Measure-Command { .\a.ps1 }
# 别 $a += $x 循环累加
$r = [Collections.Generic.List[int]]::new()
1..10000 | ForEach-Object { $r.Add($_) }
8. 环境变量 / Profile
powershell
$env:MY_ENV = "dev"
[Environment]::SetEnvironmentVariable("MY_ENV","dev","User") # 持久化
notepad $PROFILE # 放常用函数和别名
回到那行命令
powershell
Get-Content checkpoint/graph_dsl.json -Encoding UTF8
它本身只是"读一个 UTF-8 文件"。但它背后是 PowerShell 的三个特点:
Get-Content是入口 ------ 读进来之后,ConvertFrom-Json、Where-Object、ForEach-Object都能接上;-Encoding是显式契约 ------ 中文环境最容易踩的坑,写清楚就少一半麻烦;- 终端即工具 ------ 不用开 IDE、不用等 GUI,一行命令把"看一眼"变成"处理一下"。
日常写脚本时,记住 5 条就够了:
- 路径
Join-Path,别手拼。 - JSON 用
-Raw读,再ConvertFrom-Json。 - 编码显式
-Encoding UTF8,注意 5.1 的 BOM。 - 函数输出对象,不输出字符串。
- 外部命令看
$LASTEXITCODE,脚本内$ErrorActionPreference = "Stop"。
从一行 Get-Content 开始,到能进 CI 的小工具,中间差的其实就是这 5 条。