首页/系统/Windows 运维速查/变量定义与类型约束
PowerShell 基础66 条

变量定义与类型约束

变量以 $ 开头、默认弱类型但可加类型约束:[int]$x 声明后后续赋值都会按类型校验,避免隐式转换埋雷。

Windows 运维速查系统更新于 2026-10-13

PowerShell 变量是什么

变量以美元符号开头,赋值时不需要声明类型,写什么就存什么,这是 PowerShell 用起来轻松的地方,也是容易出错的根源。给变量加上类型约束后,后续每次赋值都会按该类型校验与转换,转换失败会直接报错,等于把隐式转换的隐患提前暴露。变量名不区分大小写,作用域分脚本、函数与全局等层级。理解类型转换与作用域这两件事,脚本里「数值莫名其妙变成字符串」或「函数里改了外面却没变」的问题就都能解释。

基本信息

适用平台Windows PowerShell 5.1 与 PowerShell 7 及以上
语法$变量 = 值;[类型]$变量 = 值;$变量.GetType().Name 查看实际类型
常用类型整数、双精度、字符串、日期时间、布尔、数组、哈希表
类型约束在变量名前写方括号加类型名,之后赋值都会走校验与转换
作用域脚本级、函数级、全局;函数内默认不影响外部同名变量
命名注意变量名不区分大小写,靠大小写区分含义是不可行的

典型使用场景

  • 保存命令结果供后续环节反复使用,避免重复执行耗时查询
  • 用类型约束固定端口号、计数等关键数值,防止被字符串污染
  • 把常用路径与阈值定义成变量,便于脚本统一调整
  • 用哈希表作为参数集合,把一组选项整体传给命令
  • 用数组保存主机列表,配合循环批量处理
  • 用日期类型保存时间点,直接做差得到运行时长

常用示例

常用示例
# 普通赋值
$count = 10
# 类型约束:之后赋值必须能转成整数
[int]$port = 8080
# 日期类型,便于做时间差
$begin = [datetime]'2026-10-01'
$days = (Get-Date) - $begin
# 查看实际类型,排查类型问题
$count.GetType().Name
# 数组与哈希表
$hosts = 'web01','web02'
$cfg = @{ LogPath = 'D:\Logs'; Keep = 7 }
# 输出变量内容与类型
$cfg.Keep; $hosts.Count

常见类型与转换

类型写法示例说明
整数[int]$n = 5小数会被截断,字符串需能解析为数字
双精度[double]$r = 0.25适合比值与容量换算
字符串[string]$s = 'text'单引号字面量,双引号会展开变量
日期时间[datetime]'2026-10-01'可直接做差得到时间间隔
布尔[bool]$ok = $true常用于条件判断的显式约束
数组$a = 1,2,3单元素时也是数组,用计数属性区分
弱类型下的隐式转换是常见陷阱:字符串与数字相加会先转成字符串再拼接,做数值运算前应确认两端都是数字类型,必要时显式转换。
函数内给变量赋值默认只影响函数作用域,不会改变外部的同名变量。需要把结果带出来时,用返回值或明确指定作用域,别指望外部变量被自动修改。

易错点

  • 字符串与数字混算:隐式转换会先拼成字符串,导致结果从数值变成文本,运算前先确认或显式转换类型
  • 把变量名大小写当成区分手段:变量名不区分大小写,靠大小写区分含义会覆盖前一个变量
  • 忘记类型约束的价值:关键数值被赋成字符串时不会报错,只有加了约束才会在赋值处立刻暴露
  • 误判作用域:函数内修改同名变量不影响外部,需要传出结果却没有返回值时会以为赋值失败
  • 把单元素结果当标量:某些命令只返回一个对象时它不再是数组,取下标会失败,必要时用数组包裹

数据来源与参考

  • Microsoft Learn:about_Variables
  • Microsoft Learn:about_Type_Operators

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌