如何将prnmngr命令输出转换为自定义对象?
如何将prnmngr的输出转换为自定义对象
我来帮你搞定这个问题——把cscript prnmngr.vbs -l的文本输出转换成结构化的自定义对象,不管用PowerShell还是VBScript都能轻松实现,下面是两种实用方案:
方案1:用PowerShell处理(推荐,对象操作更便捷)
PowerShell天生擅长处理文本和转换对象,步骤如下:
- 捕获prnmngr的输出:先把命令的输出存到变量里
- 分割成单个打印机的条目:每台打印机的信息从「服务器名称」开始,所以我们以此为分隔符拆分输出
- 解析键值对并创建自定义对象:遍历每个打印机条目,把每行的「名称 值」拆分后,添加到对象属性中
完整代码示例
# 捕获prnmngr的输出,过滤空行 $rawOutput = cscript prnmngr.vbs -l | Where-Object { $_ -notmatch '^\s*$' } # 按"服务器名称"分割成单个打印机的块,跳过第一个空元素 $printerBlocks = $rawOutput -join "`n" -split '(?=服务器名称)' | Select-Object -Skip 1 # 遍历每个块,创建自定义对象 $printers = foreach ($block in $printerBlocks) { $props = [ordered]@{} # 拆分每一行,处理键值对 $block -split "`n" | ForEach-Object { $parts = $_ -split '\s{2,}', 2 # 用至少两个空格分割键和值 if ($parts.Count -eq 2) { $key = $parts[0].Trim() $value = $parts[1].Trim() $props[$key] = $value } else { # 处理空值的字段(比如"注释,位置"这种没有值的行) $key = $parts[0].TrimEnd(',') $props[$key] = $null } } [PSCustomObject]$props } # 查看结果,比如筛选出驱动名称包含Canon的打印机 $printers | Where-Object { $_.'驱动名称' -like '*Canon*' }
方案2:用VBScript处理(和prnmngr同环境)
如果你需要在VBScript环境中直接处理,可以通过捕获命令输出、解析文本,用Dictionary来模拟自定义对象(VBS没有原生自定义对象,用字典存储键值对是常用方案):
完整代码示例
Set objShell = CreateObject("WScript.Shell") Set objExec = objShell.Exec("cscript prnmngr.vbs -l") Set objStdOut = objExec.StdOut ' 读取所有输出并按行拆分 strOutput = objStdOut.ReadAll arrLines = Split(strOutput, vbCrLf) ' 存储所有打印机的字典集合 Set colPrinters = CreateObject("Scripting.Dictionary") Set currentPrinter = Nothing For Each strLine In arrLines strLine = Trim(strLine) If strLine = "" Then ' 空行,跳过 Continue For End If ' 检测到新打印机的开始(服务器名称) If Left(strLine, 8) = "服务器名称" Then ' 如果有上一个打印机,先加入集合 If Not currentPrinter Is Nothing Then colPrinters.Add currentPrinter("服务器名称"), currentPrinter End If ' 创建新的字典存储当前打印机属性 Set currentPrinter = CreateObject("Scripting.Dictionary") ' 解析服务器名称 arrParts = Split(strLine, " ", 2) currentPrinter.Add "服务器名称", Trim(arrParts(1)) Else ' 解析其他键值对 arrParts = Split(strLine, " ", 2) If UBound(arrParts) = 1 Then strKey = Trim(arrParts(0)) strValue = Trim(arrParts(1)) ' 处理末尾带逗号的空值字段(比如"注释,") If Right(strKey, 1) = "," Then strKey = Left(strKey, Len(strKey)-1) strValue = "" End If currentPrinter.Add strKey, strValue End If End If Next ' 加入最后一个打印机 If Not currentPrinter Is Nothing Then colPrinters.Add currentPrinter("服务器名称"), currentPrinter End If ' 示例:遍历所有打印机,输出打印机名称和驱动名称 For Each strServer In colPrinters.Keys Set objPrinter = colPrinters(strServer) WScript.Echo "打印机名称: " & objPrinter("打印机名称") WScript.Echo "驱动名称: " & objPrinter("驱动名称") WScript.Echo "-------------------------" Next
两种方案都能把原始的文本输出转换成结构化的“对象”(PowerShell是PSCustomObject,VBS是Dictionary),方便你后续进行查询、筛选或者其他自动化操作。
内容的提问来源于stack exchange,提问作者munish
相关产品推荐
相关产品推荐

