全部文章

PowerShell 实用技巧

PowerShell 常用命令、脚本编写、文件操作、系统管理与自动化

目录 17 节

PowerShell 实用技巧

终端美化见 终端配置与美化,本文聚焦 PowerShell 实用命令与脚本技巧。

PowerShell 的强项不是“把 Bash 命令改写一遍”,而是对象管道、系统管理和 Windows 原生自动化。如果你能把这一点用起来,效率会比只把它当普通命令行高很多。

推荐掌握顺序

  1. 先学文件操作和文本搜索
  2. 再学进程、服务和网络诊断
  3. 再学环境变量和 $PROFILE
  4. 最后再写可复用函数和脚本

文件操作

# 批量重命名
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 的语法、转义、管道模型本来就不一样。与其硬套,不如优先用原生写法。

阅读建议
  • - 先读标题和摘要,再结合目录决定从哪个章节开始精读。
  • - 看到具体命令、配置或步骤时,尽量在自己的环境里同步验证。
  • - 这类文档通常和本地环境有关,建议同时打开终端或编辑器对照操作。
适合谁看
  • - 希望把零散经验整理成长期可复用工作流的人
  • - 正在搭建开发环境、统一工具链或排查构建问题的开发者
  • - 希望阅读时顺手建立自己的操作清单或收藏体系的人
执行前检查
  • - 先浏览标题、摘要和目录,带着问题阅读会更高效
  • - 确认本机 Node、包管理器、终端和仓库依赖版本是否一致
  • - 如果页面里提到相关文档,尽量一起打开对照,效果通常更完整
同类内容
← 上一篇npm scripts 与工具链