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

如何将prnmngr命令输出转换为自定义对象?

如何将prnmngr的输出转换为自定义对象

我来帮你搞定这个问题——把cscript prnmngr.vbs -l的文本输出转换成结构化的自定义对象,不管用PowerShell还是VBScript都能轻松实现,下面是两种实用方案:

方案1:用PowerShell处理(推荐,对象操作更便捷)

PowerShell天生擅长处理文本和转换对象,步骤如下:

  1. 捕获prnmngr的输出:先把命令的输出存到变量里
  2. 分割成单个打印机的条目:每台打印机的信息从「服务器名称」开始,所以我们以此为分隔符拆分输出
  3. 解析键值对并创建自定义对象:遍历每个打印机条目,把每行的「名称 值」拆分后,添加到对象属性中

完整代码示例

# 捕获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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:24:54