循环创建PowerShell自定义PSObject遇错,请求技术协助
没问题,刚接触PowerShell踩点小坑很正常~我来帮你修正代码,同时解释下你原来写法的问题所在。
首先说你原来代码的几个问题:
- 你一开始把
$custOBJ定义成了单个PSObject,不是数组,直接用$custOBJ[$i]赋值肯定会报错,因为单个对象不支持索引访问。 $numbers = @('1$i')创建的是包含字符串"1$i"的数组,既不是数字类型,也没正确解析变量$i。- 你添加的属性名是
test$i,但需求里是Name属性,不符合要求。
接下来给你两种可行的解决方案,第一种是基于你原来的思路修正,第二种是更简洁高效的PowerShell风格写法:
方案一:基于原思路的修正写法
# 先初始化存储所有对象的空数组 $array = @() # 循环100次(按需调整次数,你示例里写的10,这里改成100) for ($i = 1; $i -le 100; $i++) { # 每次循环创建一个新的空PSObject $currentObj = New-Object PSObject # 添加Name属性,值为自定义字符串(比如muzi1、muzi2...) $currentObj | Add-Member -MemberType NoteProperty -Name "Name" -Value "muzi$i" # 创建数字数组,这里给你示例不同的数字逻辑,你可以按需修改 $numbers = @($i, $i * 11, $i * 22) # 添加Numbers属性,把数字数组赋值给它 $currentObj | Add-Member -MemberType NoteProperty -Name "Numbers" -Value $numbers # 将当前对象存入数组 $array += $currentObj # 如果需要单独的$custOBJ1、$custOBJ2...变量,用New-Variable创建 New-Variable -Name "custOBJ$i" -Value $currentObj -Force }
方案二:更简洁高效的PSCustomObject写法
PowerShell 3.0及以上支持直接用[PSCustomObject]创建自定义对象,语法更简洁,而且性能更好(避免+=频繁创建新数组):
# 直接在循环中输出对象,PowerShell会自动收集到$array数组里 $array = for ($i = 1; $i -le 100; $i++) { # 直接定义对象的属性和值 [PSCustomObject]@{ Name = "muzi$i" Numbers = @($i, $i * 11, $i * 22) } # 同时创建单独的$custOBJ1、$custOBJ2...变量 New-Variable -Name "custOBJ$i" -Value $_ -Force }
补充说明
- 如果你不需要单独的
$custOBJ1到$custOBJ100变量,完全可以去掉New-Variable那一行,直接通过$array[0]、$array[1]...来访问对应位置的对象。 - 数字数组的逻辑你可以随便修改,比如用
@(Get-Random -Minimum 1 -Maximum 100, Get-Random -Minimum 1 -Maximum 100)生成随机数,只要是数字类型的数组就行。
内容的提问来源于stack exchange,提问作者Shahar
相关产品推荐
相关产品推荐

