You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中为何无法直接将Cmdlet返回的CimInstance存入ArrayList

问题成因

  • 第一种写法$data.Add({Get-Printer})错误原因:PowerShell中用{}包裹的内容是脚本块对象,你传入的是未执行的命令本身,而非命令执行后的返回结果,所以存入ArrayList的是脚本块对象,序列化后显示为命令字符串。
  • 第二种写法Get-Printer | $data.Add($_)错误原因:$_是管道上下文的当前对象变量,仅在ForEach-Object、Where-Object等管道处理块内部生效,直接在管道后调用方法无法传递管道对象,且ArrayList的Add()方法本身不支持管道输入,因此会触发报错。
  • 先存单独变量再添加可以正常工作的原因:赋值给变量时Cmdlet已经完成执行,你添加到ArrayList的是执行后返回的CimInstance对象数组,符合预期。

实现方法

首先正确初始化ArrayList:

$data = [System.Collections.ArrayList]::new()
# 兼容旧版PowerShell的写法
# $data = New-Object System.Collections.ArrayList

如果你需要把三类数据各作为ArrayList的一个独立元素存储,直接把Cmdlet包裹在括号内强制优先执行,再传入Add()方法即可,同时加Out-Null屏蔽Add()方法返回的索引值,避免多余输出:

# 添加已安装打印机列表
$data.Add((Get-Printer)) | Out-Null
# 添加已安装打印机驱动列表
$data.Add((Get-PrinterDriver | Sort-Object -Property Name)) | Out-Null
# 添加在用打印机驱动列表
$data.Add((Get-Printer | Sort-Object -Property DriverName | Select-Object DriverName -Unique)) | Out-Null

后续可以通过索引直接读取三类数据:

  • $data[0] 对应已安装打印机列表
  • $data[1] 对应已安装驱动列表
  • $data[2] 对应在用驱动列表

如果你需要把每一个打印机对象单独作为ArrayList的元素存储,而非把整个打印机列表作为一个元素,可以使用管道加ForEach-Object的写法:

Get-Printer | ForEach-Object { $data.Add($_) | Out-Null }

内容的提问来源于stack exchange,提问作者RedPanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:36:02