目录
-
PowerShell 核心概念
(图片来源网络,侵删)- 什么是 PowerShell?
- Shell vs. PowerShell ISE vs. VS Code
- 命令、 cmdlet、 函数、 脚本
- 管道
- 对象
- 提供者
- 别名
-
基础命令与操作
- 系统信息
- 文件和文件夹管理
- 进程管理
- 服务管理
- 网络管理
- 用户和组管理
- 软件管理
- 系统信息与配置
-
进阶命令与脚本
- 变量
- 条件判断
- 循环
- 函数与模块
- 错误处理
- 正则表达式
-
常用交互式命令
- 获取帮助
- 历史记录与自动补全
- 会话管理
-
实用技巧与最佳实践
(图片来源网络,侵删)- 使用
Get-Member探索对象 - 使用
Format-cmdlet 美化输出 - 使用
Select-Object精选属性 - 使用
Where-Object筛选对象 - 使用
ForEach-Object和Measure-Object - 远程执行
- 使用
-
资源与链接
PowerShell 核心概念
什么是 PowerShell?
PowerShell 是一个基于任务的命令行 shell 和脚本语言,构建在 .NET 之上,它处理的是对象,而不仅仅是文本。
Shell vs. PowerShell ISE vs. VS Code
- PowerShell (Shell): 命令行界面,用于执行命令和脚本。
- PowerShell ISE (Integrated Scripting Environment): 旧版的图形化脚本编辑器,功能强大但已停止更新。
- PowerShell VS Code: 现代、强大的跨平台代码编辑器,是编写 PowerShell 脚本的首选工具。
命令、 cmdlet、 函数、 脚本
- Cmdlet (读作 "command-let"): PowerShell 的核心命令,遵循
动词-名词的命名规范(如Get-Process,Set-Content)。 - 函数: 可以由用户或系统定义的可重用代码块,可以像 cmdlet 一样使用。
- 脚本: 保存在
.ps1文件中的一系列 cmdlet 和命令。 - 命令: 一个总称,可以指代 cmdlet、函数、脚本、外部程序等。
管道
管道 () 是将一个命令的输出作为另一个命令的输入的机制,它连接的是对象,而不是纯文本。
# 获取所有以 "s" 开头的进程,然后筛选出 CPU 使用率最高的前5个
Get-Process | Where-Object { $_.Name -like "s*" } | Sort-Object -Property CPU -Descending | Select-Object -First 5
对象
PowerShell 中的所有数据都是对象,管道传递的是对象,这使得数据可以非常灵活地被后续命令处理。

提供者
提供者让 PowerShell 能够像访问文件系统一样访问其他数据存储,如注册表 (HKLM:\)、环境变量 (Env:\)、证书 (Cert:\) 等。
别名
为了方便习惯 cmd 或其他 shell 的用户,PowerShell 提供了别名。ls 是 Get-ChildItem 的别名,cd 是 Set-Location 的别名。
基础命令与操作
系统信息
| 命令 | 功能 | 示例 |
|---|---|---|
Get-Host 或 $PSVersionTable |
显示 PowerShell 版本信息 | $PSVersionTable |
Get-ComputerInfo |
获取详细的计算机信息 | Get-ComputerInfo -OSName, OSVersion |
systeminfo |
调用外部 systeminfo.exe 命令 |
systeminfo |
文件和文件夹管理
| 命令 | 功能 | 示例 |
|---|---|---|
Get-ChildItem 或 ls, dir |
列出目录中的内容 | Get-ChildItem C:\Windows |
Set-Location 或 cd, chdir |
更改当前目录 | Set-Location C:\Temp |
New-Item |
创建新文件或目录 | New-Item -Path "C:\Temp\newfile.txt" -ItemType File |
Remove-Item 或 rm, del, rmdir |
删除文件或目录 | Remove-Item "C:\Temp\oldfile.txt" |
Copy-Item 或 cp |
复制文件或目录 | Copy-Item "C:\source.txt" -Destination "C:\destination.txt" |
Move-Item 或 mv |
移动文件或目录 | Move-Item "C:\temp\file.txt" -Destination "C:\archive\" |
Rename-Item 或 ren |
重命名文件或目录 | Rename-Item "C:\oldname.txt" -NewName "C:\newname.txt" |
Get-Content 或 cat, type |
读取文件内容 | Get-Content "C:\log.txt" |
Set-Content |
(覆盖) | Set-Content "C:\log.txt" -Value "New Log Entry" |
Add-Content |
Add-Content "C:\log.txt" -Value "Another Entry" |
|
Get-Item |
获取文件或目录的项对象 | Get-Item "C:\Windows\notepad.exe" |
Test-Path |
检查路径是否存在 | Test-Path "C:\Windows\System32" |
进程管理
| 命令 | 功能 | 示例 |
|---|---|---|
Get-Process 或 ps |
获取正在运行的进程列表 | Get-Process |
Stop-Process 或 kill, spps |
停止一个进程 | Stop-Process -Name "notepad" |
Start-Process 或 saps |
启动一个新进程 | Start-Process "notepad.exe" |
Wait-Process |
等待进程结束 | Wait-Process -Name "mspaint" |
服务管理
| 命令 | 功能 | 示例 |
|---|---|---|
Get-Service |
获取所有服务的列表 | Get-Service |
Start-Service |
启动一个服务 | Start-Service -Name "spooler" |
Stop-Service |
停止一个服务 | Stop-Service -Name "spooler" |
Restart-Service |
重启一个服务 | Restart-Service -Name "spooler" |
Set-Service |
更改服务的属性(如启动类型) | Set-Service -Name "spooler" -StartupType Automatic |
网络管理
| 命令 | 功能 | 示例 |
|---|---|---|
Test-Connection 或 ping |
测试网络连接 | Test-Connection google.com |
Resolve-DnsName 或 nslookup |
执行 DNS 查询 | Resolve-DnsName www.bing.com |
Get-NetAdapter |
获取网络适配器信息 | Get-NetAdapter | Where-Object { $_.Status -eq "Up" } |
Get-NetIPAddress |
获取 IP 地址信息 | Get-NetIPAddress -AddressFamily IPv4 |
Invoke-WebRequest 或 curl, wget |
发送 HTTP/HTTPS 请求并获取响应 | Invoke-WebRequest -Uri "https://api.github.com" -UseBasicParsing |
用户和组管理 (需要管理员权限)
| 命令 | 功能 | 示例 |
|---|---|---|
Get-LocalUser |
获取本地用户账户列表 | Get-LocalUser |
New-LocalUser |
创建新的本地用户 | New-LocalUser -Name "TestUser" -Password (Read-Host -AsSecureString "Enter Password") |
Remove-LocalUser |
删除本地用户 | Remove-LocalUser -Name "TestUser" |
Get-LocalGroup |
获取本地组列表 | Get-LocalGroup |
Add-LocalGroupMember |
将用户添加到本地组 | Add-LocalGroupMember -Group "Administrators" -Member "TestUser" |
软件管理
| 命令 | 功能 | 示例 |
|---|---|---|
Get-Package |
获取已安装的软件包 (需要 PowerShellGet 模块) | Get-Package -ProviderName Programs |
Find-Package |
查找可安装的软件包 (需要 PowerShellGet 模块) | Find-Package -Name "7zip" -Source PSGallery |
Install-Package |
安装软件包 (需要 PowerShellGet 模块) | Install-Package -Name "7zip" -Source PSGallery |
winget install |
使用 Windows Package Manager 安装软件 | winget install --id Git.Git |
系统信息与配置
| 命令 | 功能 | 示例 |
|---|---|---|
Get-HotFix |
获取已安装的 Windows 更新 | Get-HotFix -Id KB5005565 |
Get-EventLog |
读取 Windows 事件日志 | Get-EventLog -LogName Application -Newest 10 |
Get-ExecutionPolicy |
获取当前脚本执行策略 | Get-ExecutionPolicy |
Set-ExecutionPolicy |
设置脚本执行策略 | Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser |
Enable-PSRemoting |
启用 PowerShell 远程处理 (需要管理员) | Enable-PSRemoting |
进阶命令与脚本
变量
使用 符号定义和使用变量。
$myVariable = "Hello, World" Write-Output $myVariable $computerName = $env:COMPUTERNAME # 访问环境变量
条件判断
使用 if, elseif, else。
$age = 25
if ($age -ge 18) {
Write-Output "You are an adult."
} elseif ($age -ge 13) {
Write-Output "You are a teenager."
} else {
Write-Output "You are a child."
}
循环
for: 用于已知次数的循环。foreach: 用于遍历集合中的每个项。while: 当条件为真时循环。
# foreach
$processes = Get-Process
foreach ($proc in $processes) {
Write-Output $proc.Name
}
# for
for ($i = 1; $i -le 5; $i++) {
Write-Output "Count: $i"
}
函数与模块
- 函数: 封装可重用的代码块。
function Get-MyDiskInfo { Get-Volume | Format-Table DriveLetter, FileSystemLabel, SizeRemaining } Get-MyDiskInfo - 模块: 包含多个函数、cmdlet 和脚本的文件集合,用于扩展 PowerShell 功能,可以使用
Import-Module导入。
错误处理
使用 try, catch, finally 来处理可能出现的错误。
try {
# 尝试执行可能出错的代码
$content = Get-Content -Path "C:\nonexistentfile.txt"
}
catch {
# 捕获错误并处理
Write-Warning "An error occurred: $_"
}
finally {
# 无论是否出错都会执行
Write-Output "This block always runs."
}
正则表达式
PowerShell 使用 -match, -replace 等操作符支持正则表达式。
$text = "My email is test.user@example.com"
if ($text -match "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}") {
$matches[0] # 访问匹配到的内容
}
# 替换
$newText = $text -replace "test.user", "john.doe"
Write-Output $newText
常用交互式命令
获取帮助
PowerShell 的帮助系统非常强大。
| 命令 | 功能 | 示例 |
|---|---|---|
Get-Help |
获取 cmdlet、函数等的帮助信息 | Get-Help Get-Process |
Update-Help |
更新本地帮助文档 (需要管理员) | Update-Help |
Get-Command |
查找所有可用的命令 | Get-Command -Verb Get |
Get-Alias |
查找所有别名 | Get-Alias |
帮助参数:
-Detailed: 显示更详细的信息,包括参数说明。-Examples: 显示使用示例。-Full: 显示完整帮助信息(包括技术细节)。
# 查看 Get-Process 的示例 Get-Help Get-Process -Examples
历史记录与自动补全
- 上/下箭头: 浏览命令历史。
- Tab 键: 自动补全命令、参数、路径和文件名。
- Ctrl + R: 搜索命令历史 (反向搜索)。
会话管理
| 命令 | 功能 | 示例 |
|---|---|---|
Exit-PSSession 或 exit |
退出远程会话 | Exit-PSSession |
Clear-Host 或 cls |
清除屏幕 | cls |
实用技巧与最佳实践
使用 Get-Member 探索对象
这是学习 PowerShell 最重要、最强大的命令之一,它可以显示任何对象的属性和方法。
# 获取一个进程对象,然后查看它的所有成员 $proc = Get-Process -Id $PID $proc | Get-Member # 查看特定属性 $proc | Select-Object -Property Id, Name, CPU
使用 Format- cmdlet 美化输出
默认情况下,PowerShell 会以表格形式显示数据。Format- cmdlet 可以改变输出格式。
| 命令 | 功能 | 示例 |
|---|---|---|
Format-List 或 fl |
以列表形式显示每个对象的属性 | Get-Process | Format-List Name, Id, CPU |
Format-Table 或 ft |
以表格形式显示(默认) | Get-Process | Format-Table Name, Id, CPU -AutoSize |
Format-Wide |
以宽列表形式显示,只显示一个属性 | Get-ChildItem C:\Windows | Format-Wide Name -Column 3 |
使用 Select-Object 精选属性
只显示你关心的属性,使输出更清晰。
# 只显示进程的名称和ID Get-Process | Select-Object -Property Name, Id
使用 Where-Object 筛选对象
根据条件过滤对象集合。$_ 代表当前正在处理的对象。
# 只显示CPU使用率超过100的进程
Get-Process | Where-Object { $_.CPU -gt 100 }
# 使用简化语法 (推荐)
Get-Process | Where-Object CPU -gt 100
使用 ForEach-Object 和 Measure-Object
ForEach-Object: 对集合中的每个对象执行操作。Measure-Object: 对数值属性进行计算(求和、平均值等)。
# 对每个进程执行一个操作
Get-Process | ForEach-Object { Write-Output "Processing process: $($_.Name)" }
# 计算所有进程的CPU总使用量
Get-Process | Measure-Object -Property CPU -Sum
远程执行
在多台计算机上执行命令。
# 在远程计算机上执行命令
Invoke-Command -ComputerName "Server01", "Server02" -ScriptBlock {
Get-Process | Where-Object Name -like "win*"
}
# 建立持久化的远程会话
$session = New-PSSession -ComputerName "Server01"
Invoke-Command -Session $session -ScriptBlock { Get-Service }
Remove-PSSession -Session $session
资源与链接
- 官方文档:
- 学习资源:
- PowerShell Gallery: 查找和安装社区模块和脚本。
- The Scripting Guys Blog: 微软官方博客,有很多实用技巧。
- Reddit 的 r/PowerShell 社区: 讨论和问答。
- 代码编辑器:
这份大全涵盖了 PowerShell 的绝大部分常用功能,要真正掌握它,最好的方法就是多练习,尝试用 PowerShell 完成日常的自动化任务。
