Day 3: 变量与数据类型
🎯 学习目标
- 理解变量的概念和作用
- 掌握 PowerShell 的基本数据类型
- 学会变量的创建、赋值和使用
- 理解变量的作用域
- 掌握数据类型的转换
- 学会使用常量和只读变量
💡 核心概念
1. 什么是变量?
变量就像是存储数据的"容器"。你可以把数据放进这个容器,然后在需要的时候取出来使用。
生活中的比喻:
- 变量 = 盒子
- 变量名 = 盒子上的标签
- 变量值 = 盒子里的东西
示例:
# 创建一个盒子(变量),名字叫 name,里面装着"张三"
$name = "张三"
# 创建一个盒子,名字叫 age,里面装着数字 30
$age = 30
2. 变量的命名规则
2.1 命名规范
变量名必须以 $ 符号开头:
# ✅ 正确
$name
$age
$user_name
$UserName
# ❌ 错误
name # 缺少 $ 符号
$2user # 不能以数字开头
$user-name # 不能包含连字符
命名建议:
- 使用有意义的名称
- 采用驼峰命名法(Pascal Case 或 camelCase)
- 避免使用 PowerShell 保留字
好的命名示例:
$firstName = "张三"
$lastName = "李四"
$userAge = 25
$isAdmin = $true
3. PowerShell 的数据类型
PowerShell 是一种弱类型语言,但你仍然需要了解不同的数据类型。
3.1 基本数据类型
字符串(String):
$message = "Hello World"
$emptyString = ""
整数(Integer):
$count = 100
$negative = -50
浮点数(Double):
$price = 19.99
$pi = 3.14159
布尔值(Boolean):
$isValid = $true
$isComplete = $false
数组(Array):
$numbers = 1, 2, 3, 4, 5
$names = "张三", "李四", "王五"
哈希表(Hashtable):
$user = @{
Name = "张三"
Age = 30
City = "北京"
}
3.2 特殊值
$null – 表示空值:
$empty = $null
$true 和 $false – 布尔值:
$isTrue = $true
$isFalse = $false
4. 变量的赋值和使用
4.1 赋值操作
直接赋值:
$name = "张三"
$age = 30
$height = 1.75
使用表达式赋值:
$sum = 10 + 20
$product = 5 * 6
命令结果赋值:
$currentDir = Get-Location
$processes = Get-Process
4.2 访问变量值
$name = "张三"
Write-Output $name # 输出:张三
Write-Output "我的名字是 $name" # 输出:我的名字是 张三
在双引号字符串中使用变量:
$name = "张三"
$age = 30
Write-Output "我的名字是 $name,今年 $age 岁"
# 输出:我的名字是 张三,今年 30 岁
5. 数据类型转换
5.1 自动类型转换
PowerShell 会自动进行类型转换:
# 数字 + 字符串 = 字符串
$result = 10 + "20"
Write-Output $result # 输出:1020
# 数字 + 数字 = 数字
$result = 10 + 20
Write-Output $result # 输出:30
5.2 强制类型转换
使用类型转换操作符:
# 字符串转整数
$stringNumber = "100"
$number = [int]$stringNumber
Write-Output $number + 50 # 输出:150
# 数字转字符串
$number = 100
$string = [string]$number
Write-Output "数字是:$string" # 输出:数字是:100
常用类型转换:
[int] # 整数
[string] # 字符串
[double] # 浮点数
[bool] # 布尔值
[datetime] # 日期时间
示例:
# 字符串转整数
$text = "123"
$num = [int]$text
Write-Output $num + 10 # 输出:133
# 字符串转日期
$dateString = "2026-03-31"
$date = [datetime]$dateString
Write-Output $date # 输出:2026年3月31日 0:00:00
# 数字转布尔
$zero = 0
$one = 1
$boolZero = [bool]$zero # $false
$boolOne = [bool]$one # $true
6. 变量的作用域
作用域决定了变量在哪里可以被访问。
6.1 作用域类型
全局作用域:
$global:name = "张三"
# 在脚本的任何地方都可以访问
脚本作用域:
$script:name = "李四"
# 只在当前脚本中有效
局部作用域:
function Test {
$local:name = "王五"
# 只在函数内部有效
}
6.2 作用域修饰符
# 创建全局变量
$Global:myVar = "全局变量"
# 创建脚本变量
$Script:myVar = "脚本变量"
# 创建私有变量
$Private:myVar = "私有变量"
7. 常量和只读变量
7.1 创建只读变量
使用 Set-Variable 创建只读变量:
Set-Variable -Name "readOnly" -Value "不能修改" -Option ReadOnly
$readOnly = "新值" # 这会报错:无法覆盖变量 readOnly,因为它是只读变量或为常量
创建常量(Constant):
Set-Variable -Name "PI" -Value 3.14159 -Option Constant
# $PI = 3.14159 # 这会报错,因为是常量
⚠️ 重要区别:
- ReadOnly(只读):变量不能被修改,但可以被删除
- Constant(常量):变量不能被修改,也不能被删除
错误的示例:
# ❌ 这样创建的不是只读变量
$readOnly = "不能修改"
$readOnly = "新值" # 这不会报错!变量被成功修改了
7.2 使用常量
# 定义常用常量
Set-Variable -Name "MaxAttempts" -Value 3 -Option Constant
Set-Variable -Name "DefaultTimeout" -Value 30 -Option Constant
# 使用常量
Write-Output "最大尝试次数:$MaxAttempts"
Write-Output "默认超时时间:$DefaultTimeout 秒"
8. 数组操作
8.1 创建数组
# 方式1:逗号分隔
$numbers = 1, 2, 3, 4, 5
# 方式2:范围运算符
$numbers = 1..10
# 方式3:空数组
$emptyArray = @()
8.2 访问数组元素
$fruits = "苹果", "香蕉", "橙子"
Write-Output $fruits[0] # 输出:苹果
Write-Output $fruits[1] # 输出:香蕉
Write-Output $fruits[-1] # 输出:橙子(最后一个)
8.3 数组操作
# 获取数组长度
$numbers = 1, 2, 3, 4, 5
Write-Output $numbers.Length # 输出:5
# 添加元素
$numbers += 6
# 遍历数组
foreach ($num in $numbers) {
Write-Output $num
}
# 检查元素是否存在
if (3 -in $numbers) {
Write-Output "数组中包含 3"
}
9. 哈希表操作
9.1 创建哈希表
# 方式1:创建时定义
$user = @{
Name = "张三"
Age = 30
City = "北京"
}
# 方式2:逐步添加
$user = @{}
$user["Name"] = "张三"
$user["Age"] = 30
$user["City"] = "北京"
9.2 访问哈希表
$user = @{
Name = "张三"
Age = 30
City = "北京"
}
# 访问单个值
Write-Output $user["Name"] # 输出:张三
Write-Output $user.Name # 输出:张三
# 访问所有键
Write-Output $user.Keys # 输出:Name, Age, City
# 访问所有值
Write-Output $user.Values # 输出:张三, 30, 北京
🎮 实战示例
示例 1: 用户信息管理
# 创建用户信息哈希表
$user = @{
Name = "张三"
Age = 30
Email = "zhangsan@example.com"
Department = "技术部"
}
# 显示用户信息
Write-Output "用户信息:"
Write-Output "姓名:$($user.Name)"
Write-Output "年龄:$($user.Age)"
Write-Output "邮箱:$($user.Email)"
Write-Output "部门:$($user.Department)"
# 更新用户信息
$user.Age = 31
Write-Output "更新后的年龄:$($user.Age)"
示例 2: 商品价格计算
# 商品价格和数量
$prices = 19.9, 29.9, 39.9
$quantities = 2, 1, 3
# 计算总价
$total = 0
for ($i = 0; $i -lt $prices.Length; $i++) {
$itemTotal = $prices[$i] * $quantities[$i]
$total += $itemTotal
}
Write-Output "订单总价:$total 元"
示例 3: 数据类型转换
# 从用户输入获取年龄
$userInput = "25"
# 转换为整数
$age = [int]$userInput
# 验证转换结果
if ($age -gt 0) {
Write-Output "年龄:$age"
# 计算出生年份
$currentYear = (Get-Date).Year
$birthYear = $currentYear - $age
Write-Output "出生年份:$birthYear"
} else {
Write-Output "请输入有效的年龄"
}
示例 4: 数组筛选
# 数字列表
$numbers = 15, 8, 23, 42, 7, 19, 33, 5
# 筛选大于 20 的数字
$largeNumbers = $numbers | Where-Object { $_ -gt 20 }
Write-Output "大于 20 的数字:"
$largeNumbers | ForEach-Object { Write-Output $_ }
# 筛选偶数
$evenNumbers = $numbers | Where-Object { $_ % 2 -eq 0 }
Write-Output "偶数:"
$evenNumbers | ForEach-Object { Write-Output $_ }
⚠️ 重要注意事项
1. 变量命名最佳实践
# ✅ 好的命名
$userName = "张三"
$fileCount = 10
$isValid = $true
# ❌ 避免的命名
$x = "张三"
$n = "张三"
$flag = $true
2. 类型转换陷阱
# 字符串拼接 vs 数字加法
$a = "10"
$b = "20"
Write-Output ($a + $b) # 输出:1020(字符串拼接)
$a = 10
$b = 20
Write-Output ($a + $b) # 输出:30(数字相加)
3. 空值处理
$value = $null
# 检查变量是否为空
if ($null -eq $value) {
Write-Output "变量为空"
}
# 使用空值合并运算符
$result = $value -ne $null ? $value : "默认值"
Write-Output $result
4. 数组和哈希表的区别
# 数组:索引访问
$array = 1, 2, 3
Write-Output $array[0]
# 哈希表:键访问
$hash = @{Key = "Value"}
Write-Output $hash["Key"]
✍️ 练习任务
基础练习
-
变量创建
- 创建变量存储你的姓名、年龄、城市
- 创建变量存储一个数字列表
- 创建变量存储一个用户信息哈希表
-
类型转换
- 将字符串 "123" 转换为整数并加上 50
- 将数字 3.14159 转换为整数
- 将数字 0 转换为布尔值并查看结果
-
数组操作
- 创建一个包含 5 个数字的数组
- 计算数组中所有数字的和
- 找出数组中最大的数字
进阶练习
-
哈希表操作
- 创建一个学生信息哈希表(姓名、年龄、班级、成绩)
- 添加一个新的字段"是否及格"
- 根据成绩判断是否及格(60分以上)
-
数据筛选
- 创建一个数字数组 [12, 45, 67, 23, 89, 34, 56]
- 筛选出所有大于 40 的数字
- 筛选出所有偶数
- 筛选出所有能被 3 整除的数字
实战挑战
-
购物车系统
- 创建一个商品信息数组(商品名、价格、数量)
- 计算每种商品的小计
- 计算订单总价
- 如果总价超过 100,显示"包邮",否则显示"运费 10 元"
-
学生成绩管理
- 创建一个学生成绩哈希表
- 添加姓名、语文、数学、英语成绩
- 计算总分和平均分
- 判断是否优秀(平均分≥90)、良好(80≤平均分<90)、及格(60≤平均分<80)
💡 常见问题 FAQ
Q1: PowerShell 的变量名区分大小写吗?
- A1: PowerShell 不区分大小写,
$Name和$name是同一个变量。但建议保持一致性,使用驼峰命名法。
Q2: 什么时候使用单引号,什么时候使用双引号?
- A2: 单引号表示字面字符串(不解析变量),双引号表示可扩展字符串(解析变量)。
Q3: 如何删除一个变量?
- A3: 使用
Remove-Variable命令:Remove-Variable -Name "myVar"
Q4: 数组和哈希表有什么区别?
- A4: 数组使用数字索引(0, 1, 2…),哈希表使用键名(Name, Age, Email…)。
Q5: 如何检查变量的类型?
- A5: 使用
.GetType()方法:$value = 123 $value.GetType().Name # 输出:Int32
📚 拓展阅读
🎓 今日总结
变量和数据类型是 PowerShell 编程的基础。通过掌握变量的创建、赋值、作用域,以及各种数据类型的转换,你可以开始编写实用的 PowerShell 脚本。记住:PowerShell 是弱类型语言,但了解数据类型对于编写健壮的脚本仍然很重要。
⏭️ 明天预告: Day 4 – 运算符与表达式,我们将深入学习 PowerShell 的各种运算符和表达式。
学习时间: 2026-03-31
课程进度: Day 3 / 30