[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 的 x in map(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.DateTime

Name                 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 -Force
    Write-Host "已更新策略为 RemoteSigned"
}

六、今日重点总结

  • ✅ 变量以 $ 开头,支持动态/静态类型。
  • ✅ 管道传递的是对象,不是字符串,这是 PowerShell 强大的核心。
  • ✅ 用 Get-Member 探索对象结构,用 $_ 在管道中引用当前对象。
  • ✅ ExecutionPolicy 是安全机制,默认阻止脚本运行;开发建议设为 RemoteSigned(当前用户)。

📚 参考资料(来源:Microsoft Learn,已整合翻译)

  • About Variables
  • About Pipelines
  • Using the Get-Member Cmdlet
  • About Execution Policies

🏁 课后作业

  1. 编写一个命令:列出所有服务中状态为“Stopped”的服务,并只显示其名称和服务名(Name 和 DisplayName)。
  2. 创建一个变量 $files,存储当前目录下所有 .txt 文件,然后输出每个文件的名称和大小(KB)。
  3. 尝试运行一个简单的 .ps1 脚本(如 Write-Host "Hello"),观察默认策略下的报错,并通过正确方式使其运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值