[PowerShell入门教程] 第2天:变量、管道、对象操作与执行策略详解
第2天:变量、管道、对象操作与执行策略详解
🎯 学习目标
- 掌握 PowerShell 变量的声明与使用(含作用域)
- 理解管道(
|)如何传递 .NET 对象 - 学会访问和操作对象的属性与方法
- 了解并安全配置执行策略(ExecutionPolicy)
一、变量(Variables)
1. 基本语法
PowerShell 中所有变量以 $ 开头:
$name = "Alice"
$age = 30
$processes = Get-Process
💡 注意:
- 不需要显式声明类型(动态类型)
- 变量名区分大小写?不区分(Windows 默认),但在 Linux/macOS 上可能区分(PowerShell Core)
2. 查看变量值
Write-Output $name
# 或直接输入变量名
$name
3. 变量类型(可选强类型)
虽然通常不需要,但可以强制指定类型:
[int]$count = 5
[string]$message = "Hello"
[datetime]$now = Get-Date
如果赋值类型不符,会尝试转换或报错:
[int]$x = "10" # 成功
[int]$y = "abc" # 报错:无法转换
4. 特殊变量
$_:在管道或脚本块中表示当前对象(类似 Python 的xinmap(lambda x: ..., list))$?:上一个命令是否成功(True/False)$Error:错误历史记录(数组)$PSVersionTable:当前 PowerShell 版本信息
二、管道(Pipeline)—— PowerShell 的灵魂
1. 什么是管道?
管道(|)将前一个命令的输出对象传递给下一个命令作为输入对象。
✅ 关键区别:CMD 的管道传递的是文本,PowerShell 传递的是完整的 .NET 对象!
2. 实例对比:文本 vs 对象
# 获取所有进程,只显示名称和ID
Get-Process | Select-Object Name, Id# 找出 CPU 使用超过 100 秒的进程
Get-Process | Where-Object { $_.CPU -gt 100 }# 按内存使用排序(降序),取前5个
Get-Process | Sort-Object WS -Descending | Select-Object -First 5
🔍 解析:
$_表示管道中当前处理的每个进程对象.CPU是该对象的属性(类型为[double])Where-Object过滤对象,Select-Object选择属性,Sort-Object排序
3. 管道与函数组合
你可以像搭积木一样组合命令:
Get-Service |
Where-Object { $_.Status -eq 'Running' } |
Select-Object DisplayName, Status |
Format-Table -AutoSize
三、对象操作:属性与方法
PowerShell 中一切皆对象(基于 .NET)。你可以用 Get-Member 查看对象结构:
# 查看 Get-Date 返回的对象有哪些成员
Get-Date | Get-Member
输出示例:
TypeName: System.DateTimeName MemberType Definition
---- ---------- ----------
Add Method datetime Add(timespan value)
Day Property int Day {get;}
Hour Property int Hour {get;}
ToString Method string ToString()
...
1. 访问属性
$date = Get-Date
$date.Year # 输出:2025
$date.DayOfWeek # 输出:Monday
2. 调用方法
$date.ToString("yyyy-MM-dd") # 输出:2025-11-10
3. 多个对象批量操作
# 获取所有服务的名称,并转为大写
(Get-Service).Name.ToUpper()
⚠️ 注意:如果对象是数组,
.ToUpper()会自动对每个元素调用(PowerShell 的“成员枚举”特性)。
四、执行策略(ExecutionPolicy)—— 安全机制
1. 为什么需要 ExecutionPolicy?
为防止恶意脚本自动运行,PowerShell 默认禁止执行 .ps1 脚本。
Get-ExecutionPolicy
常见策略值:
| 策略 | 说明 |
|---|---|
Restricted(默认) | 不允许运行任何脚本(仅交互式命令) |
AllSigned | 仅允许运行经数字签名的脚本 |
RemoteSigned | 本地脚本可运行,远程脚本需签名(推荐开发使用) |
Unrestricted | 允许所有脚本(⚠️ 高风险,不推荐) |
Bypass | 无限制(用于自动化环境) |
2. 修改执行策略(需管理员权限)
# 以管理员身份运行 PowerShell 后执行:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
✅ 推荐使用
-Scope CurrentUser,避免影响系统全局设置。
3. 临时绕过策略(不修改设置)
# 仅本次会话允许运行脚本
PowerShell -ExecutionPolicy Bypass -File ".\myscript.ps1"
五、动手实践:综合练习
练习1:创建变量并操作对象
$myProc = Get-Process notepad -ErrorAction SilentlyContinue
if ($myProc) {Write-Host "记事本正在运行,PID: $($myProc.Id)"$myProc.Kill() # 调用方法终止进程
} else {Write-Host "记事本未运行"
}
练习2:使用管道筛选高内存进程
Get-Process |
Where-Object { $_.WorkingSet64 -gt 100MB } |
Select-Object Name, @{Name="Memory(MB)"; Expression={[math]::Round($_.WS / 1MB, 2)}} |
Sort-Object "Memory(MB)" -Descending
💡 说明:
@{}创建计算属性(Calculated Property),用于格式化输出。
练习3:检查并设置执行策略
# 查看当前策略
$current = Get-ExecutionPolicy -Scope CurrentUser
Write-Host "当前用户策略: $current"# 如果是 Restricted,则设为 RemoteSigned
if ($current -eq "Restricted") {Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -ForceWrite-Host "已更新策略为 RemoteSigned"
}
六、今日重点总结
- ✅ 变量以
$开头,支持动态/静态类型。 - ✅ 管道传递的是对象,不是字符串,这是 PowerShell 强大的核心。
- ✅ 用
Get-Member探索对象结构,用$_在管道中引用当前对象。 - ✅
ExecutionPolicy是安全机制,默认阻止脚本运行;开发建议设为RemoteSigned(当前用户)。
📚 参考资料(来源:Microsoft Learn,已整合翻译)
- About Variables
- About Pipelines
- Using the Get-Member Cmdlet
- About Execution Policies
🏁 课后作业
- 编写一个命令:列出所有服务中状态为“Stopped”的服务,并只显示其名称和服务名(Name 和 DisplayName)。
- 创建一个变量
$files,存储当前目录下所有.txt文件,然后输出每个文件的名称和大小(KB)。 - 尝试运行一个简单的
.ps1脚本(如Write-Host "Hello"),观察默认策略下的报错,并通过正确方式使其运行。
