PowerShell 实用技巧
终端美化见 终端配置与美化,本文聚焦 PowerShell 实用命令与脚本技巧。
PowerShell 的强项不是“把 Bash 命令改写一遍”,而是对象管道、系统管理和 Windows 原生自动化。如果你能把这一点用起来,效率会比只把它当普通命令行高很多。
推荐掌握顺序
- 先学文件操作和文本搜索
- 再学进程、服务和网络诊断
- 再学环境变量和
$PROFILE - 最后再写可复用函数和脚本
文件操作
# 批量重命名
Get-ChildItem *.txt | Rename-Item -NewName { $_.Name -replace 'old', 'new' }
# 查找大文件(>100MB)
Get-ChildItem -Recurse | Where-Object { $_.Length -gt 100MB } | Sort-Object Length -Descending | Select-Object FullName, @{N='SizeMB';E={[math]::Round($_.Length/1MB,1)}}
# 递归删除指定文件
Get-ChildItem -Recurse -Filter "*.log" | Remove-Item -Force
# 计算文件夹大小
(Get-ChildItem -Recurse | Measure-Object -Property Length -Sum).Sum / 1GB
# 比较两个文件夹
Compare-Object (Get-ChildItem folder1) (Get-ChildItem folder2) -Property Name
文本处理
# 搜索文件内容(类似 grep)
Select-String -Path *.ts -Pattern "TODO"
Get-ChildItem -Recurse -Filter "*.ts" | Select-String "import.*vue"
# 替换文件内容
(Get-Content file.txt) -replace 'old', 'new' | Set-Content file.txt
# 统计行数
(Get-Content file.txt | Measure-Object -Line).Lines
# 去重排序
Get-Content list.txt | Sort-Object -Unique | Set-Content sorted.txt
网络工具
# 下载文件
Invoke-WebRequest -Uri "https://example.com/file.zip" -OutFile "file.zip"
# 简写
iwr "https://example.com/file.zip" -o "file.zip"
# REST API 调用
Invoke-RestMethod -Uri "https://api.github.com/users/octocat" | Select-Object login, name
# POST 请求
Invoke-RestMethod -Method Post -Uri "https://api.example.com/data" -Body (@{key="value"} | ConvertTo-Json) -ContentType "application/json"
# 端口检测
Test-NetConnection example.com -Port 443
# DNS 查询
Resolve-DnsName example.com
进程与服务
# 查找占用端口的进程
Get-NetTCPConnection -LocalPort 3000 | Select-Object OwningProcess
Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess
# 结束进程
Stop-Process -Name "node" -Force
Get-Process | Where-Object { $_.ProcessName -match "node" } | Stop-Process
# 服务管理
Get-Service | Where-Object { $_.Status -eq "Running" }
Start-Service -Name "ssh-agent"
Stop-Service -Name "ssh-agent"
环境变量
# 查看
$env:PATH
[Environment]::GetEnvironmentVariable("PATH", "User")
# 临时设置
$env:NODE_ENV = "production"
# 永久设置(用户级)
[Environment]::SetEnvironmentVariable("MY_VAR", "value", "User")
# 添加到 PATH
$currentPath = [Environment]::GetEnvironmentVariable("PATH", "User")
[Environment]::SetEnvironmentVariable("PATH", "$currentPath;D:\Tools", "User")
实用函数
添加到 $PROFILE:
# 快速创建并进入目录
function mkcd { param($dir) New-Item -ItemType Directory -Path $dir -Force; Set-Location $dir }
# 查看端口占用
function port { param($p) Get-NetTCPConnection -LocalPort $p -ErrorAction SilentlyContinue | Select-Object LocalPort, OwningProcess, @{N='Process';E={(Get-Process -Id $_.OwningProcess).ProcessName}} }
# 快速 Base64 编解码
function b64e { param($s) [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($s)) }
function b64d { param($s) [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($s)) }
# 计算文件哈希
function hash { param($file) Get-FileHash $file -Algorithm SHA256 | Select-Object Hash }
脚本执行策略
# 查看当前策略
Get-ExecutionPolicy
# 允许运行本地脚本
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# 临时绕过
powershell -ExecutionPolicy Bypass -File script.ps1
参考链接
常见使用场景
开发机维护
- 搜日志
- 查端口
- 改环境变量
- 批量整理文件
系统排障
- 查服务状态
- 查进程占用
- 查 DNS / 网络连通
自动化脚本
- 定时任务
- 文件清理
- 配置初始化
常见问题
脚本运行被拦住
大多数时候是执行策略问题,不一定是脚本本身有错。
命令明明有输出,但后面接不上
PowerShell 管道传的是对象,不总是纯文本。遇到这种情况先看对象属性,再决定怎么 Select-Object 或格式化。
为什么复制来的 Linux 命令不好使
因为 PowerShell 和 Bash 的语法、转义、管道模型本来就不一样。与其硬套,不如优先用原生写法。
- PowerShell 文档 — 微软官方
- PowerShell GitHub — 源码
- PSReadLine — 命令行增强
- 环境变量管理 — 如果你正在处理 PATH、配置注入和变量分层