win10中文 以及 PowerShell 开发日常

一行命令,和它背后的 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,没有等待。

就这一行,解决了三个小问题:

  1. 不用开编辑器------终端里直接看;
  2. 不卡------没有 GUI 启动开销;
  3. 不乱码 -------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 条就够了:

  1. 路径 Join-Path,别手拼。
  2. JSON 用 -Raw 读,再 ConvertFrom-Json。
  3. 编码显式 -Encoding UTF8,注意 5.1 的 BOM。
  4. 函数输出对象,不输出字符串。
  5. 外部命令看 $LASTEXITCODE,脚本内 $ErrorActionPreference = "Stop"。

从一行 Get-Content 开始,到能进 CI 的小工具,中间差的其实就是这 5 条。

相关推荐
共享家952717 小时前
408 操作系统第一章
服务器·数据库·windows
Sakura_j_h_19 小时前
GitHub Actions 打包 Windows exe:中文编码与产物上传
windows·ci/cd·打包发布·github·pyinstaller·github actions
xixiaoyunya21 小时前
搭一个浏览器即用的二进制文件分发点:目录规范与权限边界实践
网络·windows
麻瓜code1 天前
Spring AI 全模块 API 字典一览(1.1.0 版)
人工智能·windows·spring
zrc0070071 天前
steam无法登录 steam错误 登录时出现错误。请稍后再试。解决办法 steam无法登录解决办法 湖南地区steam DNS问题解决办法
windows·经验分享·游戏·缓存·游戏程序·创业创新·玩游戏
BK贝壳1 天前
布尔队列 BHA_Queue:入队出队均摊 O(1);附 BHA_Dict
windows
-星空下无敌1 天前
Windows Docker K8s 安装部署Naocs ,SpringBoot 3.x 4.x 整合Naocs 版本兼容 配置中心、服务注册与发现
windows·docker·nacos·kubernetes·springboot·alibaba
燃烧的枫1 天前
Windows 下 YOLO11 Pose 的 TensorRT C++ 部署
windows·yolo·tensorrt·1024程序员节·yolo11-pose
深圳恒讯1 天前
香港云主机硬盘满了怎么办?Linux和Windows在线扩容操作教程
linux·运维·windows