PowerShell中循环数组时使用的@符号作用是什么?
PowerShell 数组声明中
@符号的作用 首先明确,你看到的@()语法是PowerShell中的数组子表达式运算符,和直接用逗号分隔声明数组的核心区别不在普通多元素场景,而在边界场景的兼容性:
- 普通多元素场景下,
$myarray = 1,2,3,4,5和$myarray = @(1,2,3,4,5)的效果完全一致,两者最终得到的都是System.Object[]类型的数组,循环遍历、值读取等操作没有任何差异,这也是你测试时输出结果完全相同的原因。 @()的核心作用是强制将运算符内的输出结果封装为数组,哪怕运算符内的结果是空、或者只有单个元素:- 空值场景:如果你要声明空数组,直接写
$arr =是无效的,但$arr = @()可以直接得到一个长度为0的空数组,后续往数组追加元素的逻辑不会报错。 - 单元素场景:如果你用逗号写法声明单元素数组,必须写成
$arr = ,1,漏掉开头的逗号的话$arr = 1得到的就是一个Int32类型的数值,不是数组,后续遍历循环会直接把整个变量当作单个对象处理;但用@()写法的话,哪怕你写$arr = @(1),得到的也一定是长度为1的数组,不会出现类型不符合的问题。 - 动态结果场景:如果你是从命令输出、表达式计算结果来生成数组,比如
$arr = Get-Process notepad,如果没有找到notepad进程,得到的就是$null,如果找到1个得到的是单个Process对象,找到多个才是数组;但写成$arr = @(Get-Process notepad)的话,不管找到多少个结果,返回的一定是数组,不存在空值或者单个对象的情况,后续写循环逻辑不用额外做类型判断,兼容性更强。
- 空值场景:如果你要声明空数组,直接写
所以大家写循环前用@()声明数组,本质是为了统一所有边界场景下的变量类型,避免后续循环逻辑因为数组为空、只有单个元素时出现非预期的报错,属于提升代码健壮性的写法,不是多元素场景下有什么特殊功能。
补充小提示:PowerShell 3.0及以上版本还支持更简洁的强类型数组声明
[int[]]$arr = 1,2,3,也能达到强制数组类型的效果,适用场景和@()有部分重叠。
内容的提问来源于stack exchange,提问作者Eric Pilati
相关产品推荐
相关产品推荐

