PowerShell 命令速查表 - PowerShell 常用命令大全
Windows 上的自动化脚本,坑几乎都出在把 PowerShell 当 cmd 用:管道里流着对象,你却在拼字符串,于是 Where-Object、Sort-Object 全都用不上。这张表按基础命令、文件与目录、内容操作、管道与筛选、进程与服务、网络与远程、脚本编写、系统管理八组铺开,每条都标出与 Linux 命令的差异。判断依据是输出能不能被继续处理——能 Select-Object 取到属性,就能接着 Where-Object;只能靠正则抠文本,说明命令选错了。什么时候翻它:写部署或巡检脚本、批量改扩展名与文件编码、服务起不来要定位依赖、在几十台机器上跑同一段修复。与 bash 的分界很清楚:路径分隔符、换行符、默认编码全是 Windows 特有的,跨 shell 混用会得到难以解释的结果,这时应当老老实实回到本表逐条核对。
典型使用场景
面向 Windows 系统运维、开发与日常自动化的工程师。本表的核心是「对象管道」思维:PowerShell 传递的是对象而非文本,所以 Get-Content 读出的每行、Get-ChildItem 列出的每个条目都能被 Where-Object / Select-Object / Sort-Object / Group-Object / Measure-Object / ForEach-Object 逐层加工。把这条链子用熟后,「列出占用内存最高的 5 个进程并导出 CSV」「找出某个目录下体积最大的文件」这类需求都是一行命令。另有四条支线同样高频:进程与服务管理(Get-Process / Get-Service / Start-Service)、网络请求(Invoke-RestMethod 代替 curl)、远程执行(Invoke-Command / Enter-PSSession)、系统信息与事件日志(CIM / Get-EventLog)。忘记某个命令叫什么时,Get-Command 与 Get-Help 是权威入口。
基础命令 5
Get-CommandGet-Help Get-ProcessGet-MemberGet-VerbGet-Alias文件与目录 8
Get-ChildItemSet-Location ..New-Item -ItemType Directory -Path C:\NewDirCopy-Item src.txt dst.txtMove-Item src.txt dst.txtRemove-Item file.txtRename-Item old.txt new.txtTest-Path C:\path内容操作 8
Get-Content file.txtSet-Content file.txt "text"Add-Content file.txt "text"Out-File output.txtExport-Csv data.csv -NoTypeInformationImport-Csv data.csvConvertTo-JsonConvertFrom-Json管道与筛选 6
Where-Object { $_.Name -eq "svchost" }Select-Object -First 10 Name,IdSort-Object Name -DescendingGroup-Object StatusMeasure-Object -Sum -AverageForEach-Object { $_ * 2 }进程与服务 9
Get-ProcessGet-Process -Name "chrome"Stop-Process -Name "notepad"Start-Process notepad.exeGet-ServiceStart-Service SpoolerStop-Service SpoolerRestart-Service SpoolerSet-Service Spooler -StartupType Automatic网络与远程 6
Test-Connection 8.8.8.8Test-NetConnection google.com -Port 443Invoke-WebRequest -Uri https://api.example.comInvoke-RestMethod -Uri https://api.example.comEnter-PSSession -ComputerName Server01Invoke-Command -ComputerName Server01 -ScriptBlock { Get-Process }脚本编写 8
$name = "World"$array = 1,2,3; $array[0]$hash = @{ Name = "Tom"; Age = 30 }if ($val -gt 10) { "big" } else { "small" }switch ($val) { 1 { "one" } default { "?" } }foreach ($item in $items) { $item }function Say-Hello { param($name) "Hello $name" }try { 1/0 } catch { "error: $_" } finally { "done" }系统管理 8
Get-DateSet-Date "2026-01-01"Get-WmiObject Win32_ProcessorGet-CimInstance Win32_LogicalDiskFormat-Table Name,Id -AutoSizeFormat-List Name,IdFormat-Wide Name -Column 4Get-EventLog -LogName System -Newest 10参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
Get-Command | 列出所有可用命令(cmdlet/函数/别名) | Get-Command |
Get-Help <Cmd> -Detailed | 查看命令帮助文档 | Get-Help Get-Process -Detailed |
Get-Member | 查看管道中对象的属性与方法 | Get-Process | Get-Member |
Get-Verb | 列出 PowerShell 批准的动词 | Get-Verb |
Get-Alias | 列出所有命令别名 | Get-Alias |
Get-ChildItem | 列出目录内容 | Get-ChildItem -Path D:/code |
Set-Location .. | 切换目录 | Set-Location .. |
New-Item -ItemType Directory | 创建新目录 | New-Item -ItemType Directory -Path D:/NewDir |
Copy-Item / Move-Item | 复制 / 移动(重命名) | Move-Item src.txt dst.txt |
Remove-Item | 删除文件或目录 | Remove-Item file.txt |
Rename-Item | 重命名文件或目录 | Rename-Item old.txt new.txt |
Test-Path | 检查路径是否存在 | Test-Path C:/path |
Get-Content | 读取文件内容 | Get-Content package.json |
Set-Content | 写入文件(覆盖) | Set-Content file.txt "text" |
Add-Content | 向文件末尾追加内容 | Add-Content file.txt "text" |
Out-File | 把管道输出写入文件 | Get-Process | Out-File output.txt |
Export-Csv -NoTypeInformation | 导出对象为 CSV(无类型行) | Get-Process | Export-Csv data.csv -NoTypeInformation |
Import-Csv | 从 CSV 导入为对象 | Import-Csv data.csv |
ConvertTo-Json | 对象转 JSON 字符串 | Get-Process | Select-Object -First 3 | ConvertTo-Json |
ConvertFrom-Json | JSON 字符串转对象 | $o = $json | ConvertFrom-Json |
Where-Object { $_.Name -eq "svchost" } | 按属性筛选对象 | Get-Process | Where-Object { $_.Name -eq "svchost" } |
Select-Object -First 10 Name,Id | 选属性或取前 N 条 | Get-Process | Select-Object -First 10 Name,Id |
Sort-Object Name -Descending | 按属性排序(可降序) | Get-Process | Sort-Object WS -Descending |
Group-Object Status | 按属性分组统计 | Get-Process | Group-Object Status |
Measure-Object -Sum -Average | 计算总和与平均值等统计 | Get-Process | Measure-Object WS -Sum -Average |
ForEach-Object { $_ * 2 } | 对每个对象执行操作 | 1..3 | ForEach-Object { $_ * 2 } |
Get-Process -Name "chrome" | 按名称查找进程 | Get-Process -Name "chrome" |
Stop-Process -Name | 结束指定进程 | Stop-Process -Name "notepad" |
Start-Process | 启动新进程 | Start-Process notepad.exe |
Get-Service | 列出所有 Windows 服务 | Get-Service |
Start-Service / Stop-Service / Restart-Service | 启动 / 停止 / 重启服务 | Restart-Service Spooler |
Set-Service -StartupType | 设置服务启动类型 | Set-Service Spooler -StartupType Automatic |
Test-Connection | 测试网络连通性 | Test-Connection 8.8.8.8 |
Test-NetConnection -Port | 测试端口连通性 | Test-NetConnection google.com -Port 443 |
Invoke-WebRequest | 发送 HTTP/HTTPS 请求 | Invoke-WebRequest -Uri https://api.example.com |
Invoke-RestMethod | 发送 REST 请求并自动解析响应 | Invoke-RestMethod -Uri https://api.example.com |
Enter-PSSession -ComputerName | 进入远程 PowerShell 会话 | Enter-PSSession -ComputerName Server01 |
Invoke-Command -ScriptBlock | 在远程机器上执行命令 | Invoke-Command -ComputerName Server01 -ScriptBlock { Get-Process } |
$name = "World" | 定义变量($ 前缀) | $name = "World" |
$array = 1,2,3; $array[0] | 数组定义与索引访问 | $array = 1,2,3; $array[0] |
$hash = @{ Name = "Tom" } | 哈希表定义 | $hash = @{ Name = "Tom"; Age = 30 } |
if ($val -gt 10) | 条件判断(-gt/-lt/-eq) | if ($val -gt 10) { "big" } else { "small" } |
switch ($val) { ... default { } } | 多分支判断 | switch ($val) { 1 { "one" } default { "?" } } |
foreach ($item in $items) | 遍历数组或集合 | foreach ($item in $items) { $item } |
function Say-Hello { param($name) } | 定义带参数的函数 | function Say-Hello { param($name) "Hello $name" } |
try / catch / finally | 异常处理三段式 | try { 1/0 } catch { "error: $_" } finally { "done" } |
Get-Date / Set-Date | 获取 / 设置系统日期时间 | Get-Date |
Get-WmiObject Win32_Processor | WMI 查询硬件信息 | Get-WmiObject Win32_Processor |
Get-CimInstance Win32_LogicalDisk | CIM 查询磁盘信息(推荐) | Get-CimInstance Win32_LogicalDisk |
Format-Table -AutoSize | 表格输出,自动对齐列宽 | Get-Process | Format-Table Name,Id -AutoSize |
Format-List | 列表输出,每属性一行 | Get-Process | Format-List Name,Id |
Format-Wide -Column 4 | 宽格式多列输出 | Get-ChildItem | Format-Wide Name -Column 4 |
Get-EventLog -LogName System -Newest 10 | 查看系统事件日志 | Get-EventLog -LogName System -Newest 10 |
易错点与避坑指南
现象管道里 grep 不到内容,输出为空,但文件里明明有该字符串
原因PowerShell 管道传的是对象属性而不是原始文本,用 Where-Object 对文本内容匹配时属性名写错就匹配不到。
处置先用 Get-Member 查看对象有哪些属性;若要按文本过滤,在 Where-Object 里用 Select-String 组合,而不是直接比较不存在的属性。
现象在 PowerShell 里写 bash 风格的 ls、grep、curl 全部报错或行为异常
原因这些是别名(Alias)指向 Windows 兼容实现,参数语义与类 Unix 版本不同,选项也未必支持。
处置用 Get-Alias 查别名指向的真实命令,直接用 Get-ChildItem / Where-Object / Invoke-RestMethod 这类规范命令,参数行为可预期。
现象Stop-Process 或 Remove-Service 报权限拒绝,管理员窗口里却正常
原因进程与服务管理属于系统级操作,需要提升权限的会话。
处置用管理员身份的 PowerShell 执行;也可先用 Get-Process / Get-Service 确认目标存在再操作。
现象Get-Process 输出的表格列又宽又挤,主要字段被截断看不到
原因默认按表格格式输出并按终端宽度自动换行,列多时超出宽度的部分不可见。
处置用 Select-Object 只保留需要的列,配 Format-Table -AutoSize;或对单个对象用 Format-List 每个属性一行完整显示。
现象Export-Csv 导出的文件在 Excel 里表头变成一堆类型描述
原因未加 -NoTypeInformation 时 CSV 首行会写入类型信息行。
处置导出时加 -NoTypeInformation,必要时用 Import-Csv 回读验证列名是否干净。
现象在交互式会话里定义了变量,下一条命令却是空值
原因变量作用域默认只在当前作用域有效,函数或脚本块内赋值不会外泄;另一次会话之间也不共享变量。
处置需要外传时在变量前加脚本作用域修饰或用 $script: 前缀;长期环境定制应写入 $profile 文件,避免每次重开会话丢失。
现象Set-Content 写入后原有文件内容全部丢失
原因Set-Content 是覆盖语义,不是追加语义,与直觉相反。
处置要追加改用 Add-Content;写之前先用 Test-Path 与 Get-Content 确认路径和内容。
现象1..3 | ForEach-Object { $_ } 输出的 $ 与预期数字不符,字符串拼接全乱了
原因管道里每个元素类型不固定,字符串与数字混合时隐式转换会导致拼接结果诡异。
处置在管道里先用 Select-Object 收敛出需要的单一属性,再做运算;必要时用 [int] 或 [string] 显式转换类型。
排障路径
1不清楚管道对象有哪些字段时先探结构
Get-Process | Select-Object -First 1 | Get-MemberGet-Member 会列出该对象的类型名、属性名与方法名。有了准确属性名(如 Name、Id、WS)才能写 Where-Object 和 Sort-Object,避免匹配不到任何结果。
2找出最占内存的 5 个进程
Get-Process | Sort-Object WS -Descending | Select-Object -First 5 Name,Id,WS | Format-Table Name,Id -AutoSize按 WS(工作集内存)降序排序,取前 5 条并只保留关键列后表格才不会被截断。若结果显示异常大的进程,可接 Stop-Process -Name 结束它。
3确认某个服务是否在运行及其启动类型
Get-Service Spooler | Format-List Name,Status,StartTypeStatus 显示 Running 或 Stopped,StartType 显示 Automatic / Manual / Disabled。确认为 Stopped 后用 Start-Service Spooler 启动,需开机自启用 Set-Service Spooler -StartupType Automatic。
4排查接口不通
Test-Connection 8.8.8.8; Test-NetConnection api.example.com -Port 443第一步验证 ICMP 层可达,第二步验证目标端口是否开放。Ping 通但端口不通通常是服务未监听或被防火墙拦截,两者都不通才是网络层问题。
5调用 REST 接口并处理 JSON
Invoke-RestMethod -Uri https://api.example.com/data | ConvertTo-JsonInvoke-RestMethod 会自动把 JSON 解析成对象,直接当管道对象用;需要落盘或查看结构时接 ConvertTo-Json。若响应是纯文本而非 JSON,改用 Invoke-WebRequest 并取其内容。
6导出结果到 CSV 并回读校验
Get-Process | Select-Object Name,Id | Export-Csv proc.csv -NoTypeInformation; Import-Csv proc.csv | Select-Object -First 3导出后立刻 Import-Csv 回读并取前 3 行,能同时验证表头是否干净(无类型信息行)与字段是否按预期落盘,避免带着脏表头交付数据。
7在远程机器上执行诊断命令
Invoke-Command -ComputerName Server01 -ScriptBlock { Get-Service | Select-Object -First 5 Name,Status }结果会以带远程主机前缀的形式返回,本地不改动任何状态。若需要多步交互式排查,改用 Enter-PSSession -ComputerName Server01 进入会话。
8查系统最近的异常线索
Get-EventLog -LogName System -Newest 10 | Format-List TimeGenerated,EntryType,Source,Message取最近 10 条并用 Format-List 展开完整字段,重点看 Level/EntryType 为 Error 的条目及其 Message,通常能直接指出是哪个服务或驱动出的问题。
命令示例
按 CPU 排序找出最耗资源的进程
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 Name, Id, @{N="MB";E={[math]::Round($_.WorkingSet64/1MB,1)}}管道是 PowerShell 的核心:Get-Process 产出对象,Sort-Object 排序,Select-Object 投影需要的列。MB 用计算属性换算字节。
输出
Name Id MB ---- -- ---- chrome 1452 812.4 code 2031 496.0 Teams 1876 231.7
批量终止同名进程
Get-Process node -ErrorAction SilentlyContinue | Stop-Process -Force-ErrorAction SilentlyContinue 在没有匹配进程时不报错,适合脚本里直接用。先用 Get-Process 确认列表再加 -Force。
调用 REST API 并自动解析 JSON
$r = Invoke-RestMethod -Uri https://api.github.com/users/octocat
$r.login
$r.public_reposInvoke-RestMethod 自动把 JSON 转成对象,属性用点号访问;Invoke-WebRequest 则返回原始文本需要自己 ConvertFrom-Json。
输出
octocat 8
测试端口连通性
Test-NetConnection github.com -Port 443比手工 ping 更能定位问题——ping 通只说明 ICMP 可达,这里能确认具体端口是否开放。
输出
ComputerName : github.com RemoteAddress : 140.82.121.4 RemotePort : 443 TcpTestSucceeded : True
常见坑与注意事项
- Remove-Item -Recurse -Force 会无提示删除整个目录树且不进回收站,执行前务必确认路径。
- PowerShell 5.1 与 7+ 有大量不兼容差异,跨版本脚本要确认 $PSVersionTable。
- Set-Content 与 Out-File 默认写 UTF-16LE,跨程序读取常出乱码,显式指定 -Encoding utf8。
- Stop-Process -Force 是强杀,来不及保存数据,先尝试不带 -Force。
- 命令别名在非交互环境中不生效,脚本里应写完整 cmdlet 名。
提示
- PowerShell 命令采用"动词-名词"命名规范,如 Get-Process、Stop-Service
- 使用 Get-Command 查找所有可用命令,Get-Help 查看帮助
- 管道传递的是对象而不是文本,用 Get-Member 查看对象属性和方法
- 变量用 $ 前缀,如 $var = "hello"
- 使用 $profile 文件自定义 PowerShell 环境,类似 .bashrc
- Windows PowerShell 5.1 默认按 ANSI 读写文件,脚本含中文先设 $OutputEncoding 与 [Console]::OutputEncoding 为 UTF8,否则输出乱码。
- 能拿到对象就别用 Select-String 抠文本,Where-Object 之后接 Sort-Object / Group-Object 才能继续聚合。
- 远程执行前目标机需 Enable-PSRemoting -Force 开启 WinRM,否则 Invoke-Command 与 Enter-PSSession 都会连接失败。
常见问题
PowerShell 管道里传的是对象还是文本,这会怎样影响调试?
传的是对象。Get-ChildItem 产生的是 FileInfo/DirectoryInfo 实例,Where-Object { $_.Name -eq "svchost" } 里 $_ 能直接取 .Name、.Length、.LastWriteTime 等属性,而不是被切开的字符串列。这也解释了为什么 PowerShell 没有 grep:筛选条件应写成属性比较而非正则。想确认手上对象有哪些字段,用 Get-Member,它会列出可用属性与方法;转文本请显式调用 ToString() 或 Out-File。
想按名称找进程并结束它,Get-Process 和 Stop-Process 怎么配合?
先用 Get-Process -Name "chrome" 列出所有同名进程(可能有多条实例),确认要处理的是哪些 PID;再用 Stop-Process 指定 -Name "notepad" 或 -Id <pid> 结束它们。管道写法 Get-Process -Name "chrome" | Stop-Process 会一次性杀掉全部实例,属于危险操作,建议先加 Where-Object { $_.Id -eq $pid } 或先用 Select-Object Id,Path 看清目标再动手。
调试 PowerShell 脚本时怎么快速摸清一个 cmdlet 的能力?
三件套:Get-Command 列出所有可用 cmdlet、函数与别名,用来确认名字是否存在(也能看到 Get-Alias 里 ls、cd、where 这类映射到哪个正式命令);Get-Help Get-Process 打开帮助文档,加 -Detailed 看完整参数与示例;Get-Member 检查管道输出对象的属性和方法,参数写错往往在这里就能发现。脚本本身用 $profile 自定义环境,异常处理用 try/catch/finally。
远程操作一台机器,选 Enter-PSSession 还是 Invoke-Command?
看是否需要交互。Invoke-Command -ComputerName Server01 -ScriptBlock { Get-Process } 是一次性、非交互执行:命令在远端跑,结果回本地打印,做完就断开,适合批量巡检。Enter-PSSession -ComputerName Server01 建立持久会话,你进入远端上下文,可反复执行命令、调 Get-Help、改变量,改动会影响远端机器;用 exit 退出。传输层同样是 PowerShell 远程管理,用它前先用 Test-NetConnection 确认目标端口可达。
怎样把进程列表或查询结果整理成可读表格或 CSV 文件?
管道后面直接挂格式化 cmdlet:Format-Table Name,Id -AutoSize 自动对齐列宽,属性多时改用 Format-List Name,Id 每行一个属性,Format-Wide Name -Column 4 做多列并排。需要落盘复用时用 Export-Csv data.csv -NoTypeInformation(-NoTypeInformation 去掉类型头行,便于其它工具解析),反向用 Import-Csv data.csv 读回对象;先筛选排序再导出,例如 Get-Process | Sort-Object WS -Descending | Select-Object -First 10。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。