PowerShell 命令速查表 - PowerShell 常用命令大全

Windows 上的自动化脚本,坑几乎都出在把 PowerShell 当 cmd 用:管道里流着对象,你却在拼字符串,于是 Where-Object、Sort-Object 全都用不上。这张表按基础命令、文件与目录、内容操作、管道与筛选、进程与服务、网络与远程、脚本编写、系统管理八组铺开,每条都标出与 Linux 命令的差异。判断依据是输出能不能被继续处理——能 Select-Object 取到属性,就能接着 Where-Object;只能靠正则抠文本,说明命令选错了。什么时候翻它:写部署或巡检脚本、批量改扩展名与文件编码、服务起不来要定位依赖、在几十台机器上跑同一段修复。与 bash 的分界很清楚:路径分隔符、换行符、默认编码全是 Windows 特有的,跨 shell 混用会得到难以解释的结果,这时应当老老实实回到本表逐条核对。

系统与运维·共 58 条命令·最后更新 2026-07-21
powershellwindows脚本自动化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-Command
列出所有可用的 PowerShell 命令(cmdlet、函数、别名)
Get-Help Get-Process
查看命令帮助文档,加 -Detailed 查看更多详情
Get-Member
查看管道中对象的属性和方法
Get-Verb
列出所有 PowerShell 批准的动词
Get-Alias
列出所有命令别名

文件与目录 8

Get-ChildItem
列出目录内容,类似 ls/dir
Set-Location ..
切换目录,类似 cd
New-Item -ItemType Directory -Path C:\NewDir
创建新目录或文件
Copy-Item src.txt dst.txt
复制文件或目录,类似 cp
Move-Item src.txt dst.txt
移动或重命名文件,类似 mv
Remove-Item file.txt
删除文件或目录,类似 rm
Rename-Item old.txt new.txt
重命名文件或目录
Test-Path C:\path
检查路径是否存在,返回 True/False

内容操作 8

Get-Content file.txt
读取文件内容,类似 cat
Set-Content file.txt "text"
写入文件内容(覆盖)
Add-Content file.txt "text"
追加内容到文件
Out-File output.txt
将输出写入文件
Export-Csv data.csv -NoTypeInformation
导出对象为 CSV 文件
Import-Csv data.csv
从 CSV 文件导入对象
ConvertTo-Json
将对象转换为 JSON 格式
ConvertFrom-Json
从 JSON 字符串创建对象

管道与筛选 6

Where-Object { $_.Name -eq "svchost" }
筛选对象,类似 grep,可简写为 where
Select-Object -First 10 Name,Id
选择对象属性或前 N 个,可简写为 select
Sort-Object Name -Descending
对对象排序,可简写为 sort
Group-Object Status
按属性分组统计
Measure-Object -Sum -Average
计算数值统计信息(总和、平均值等)
ForEach-Object { $_ * 2 }
对管道中每个对象执行操作,可简写为 foreach

进程与服务 9

Get-Process
列出所有正在运行的进程,类似 ps
Get-Process -Name "chrome"
按名称查找进程
Stop-Process -Name "notepad"
停止指定进程,类似 kill
Start-Process notepad.exe
启动新进程
Get-Service
列出所有 Windows 服务
Start-Service Spooler
启动服务
Stop-Service Spooler
停止服务
Restart-Service Spooler
重启服务
Set-Service Spooler -StartupType Automatic
设置服务启动类型(自动/手动/禁用)

网络与远程 6

Test-Connection 8.8.8.8
测试网络连接,类似 ping
Test-NetConnection google.com -Port 443
高级网络诊断,测试端口连通性
Invoke-WebRequest -Uri https://api.example.com
发送 HTTP/HTTPS 请求,类似 curl
Invoke-RestMethod -Uri https://api.example.com
发送 REST API 请求,自动解析 JSON/XML
Enter-PSSession -ComputerName Server01
进入远程 PowerShell 会话,类似 SSH
Invoke-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" }
条件判断,-gt 大于/-lt 小于/-eq 等于
switch ($val) { 1 { "one" } default { "?" } }
Switch 多分支判断
foreach ($item in $items) { $item }
遍历数组或集合
function Say-Hello { param($name) "Hello $name" }
定义函数,支持参数
try { 1/0 } catch { "error: $_" } finally { "done" }
异常处理 try/catch/finally

系统管理 8

Get-Date
获取当前日期时间
Set-Date "2026-01-01"
设置系统日期时间
Get-WmiObject Win32_Processor
通过 WMI 查询系统信息(CPU)
Get-CimInstance Win32_LogicalDisk
通过 CIM 查询磁盘信息(推荐代替 WMI)
Format-Table Name,Id -AutoSize
表格格式输出,自动调整列宽
Format-List Name,Id
列表格式输出,每个属性一行
Format-Wide Name -Column 4
宽格式输出,多列显示
Get-EventLog -LogName System -Newest 10
查看系统事件日志(最新 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-JsonJSON 字符串转对象$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_ProcessorWMI 查询硬件信息Get-WmiObject Win32_Processor
Get-CimInstance Win32_LogicalDiskCIM 查询磁盘信息(推荐)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. 1不清楚管道对象有哪些字段时先探结构

    Get-Process | Select-Object -First 1 | Get-Member

    Get-Member 会列出该对象的类型名、属性名与方法名。有了准确属性名(如 Name、Id、WS)才能写 Where-Object 和 Sort-Object,避免匹配不到任何结果。

  2. 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. 3确认某个服务是否在运行及其启动类型

    Get-Service Spooler | Format-List Name,Status,StartType

    Status 显示 Running 或 Stopped,StartType 显示 Automatic / Manual / Disabled。确认为 Stopped 后用 Start-Service Spooler 启动,需开机自启用 Set-Service Spooler -StartupType Automatic。

  4. 4排查接口不通

    Test-Connection 8.8.8.8; Test-NetConnection api.example.com -Port 443

    第一步验证 ICMP 层可达,第二步验证目标端口是否开放。Ping 通但端口不通通常是服务未监听或被防火墙拦截,两者都不通才是网络层问题。

  5. 5调用 REST 接口并处理 JSON

    Invoke-RestMethod -Uri https://api.example.com/data | ConvertTo-Json

    Invoke-RestMethod 会自动把 JSON 解析成对象,直接当管道对象用;需要落盘或查看结构时接 ConvertTo-Json。若响应是纯文本而非 JSON,改用 Invoke-WebRequest 并取其内容。

  6. 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. 7在远程机器上执行诊断命令

    Invoke-Command -ComputerName Server01 -ScriptBlock { Get-Service | Select-Object -First 5 Name,Status }

    结果会以带远程主机前缀的形式返回,本地不改动任何状态。若需要多步交互式排查,改用 Enter-PSSession -ComputerName Server01 进入会话。

  8. 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_repos

Invoke-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日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们