【问题标题】:Combine text from multiple lines to form each row of a CSV file组合多行文本以形成 CSV 文件的每一行
【发布时间】:2018-08-11 04:17:25
【问题描述】:

我正在尝试清理

的输出
cscript 'C:\Program Files (x86)\Microsoft Office\Office16\ospp.vbs' /dstatus

我只想显示许可证和密钥的最后 5 个字符,例如

Office16HomeBusinessR_Retail3 版,7H67X

我有它的一部分,但不能完全组合在一起。

$comp = "Computername"
$OfficLice = "C:\share\OfficLice.csv"
$localtemp = "C:\share\OfficLiceTemp.csv"

cscript 'C:\Program Files (x86)\Microsoft Office\Office16\ospp.vbs' /dstatus $comp | add-content $localtemp

$lic = get-content $localtemp | where {$_ -like "LICENSE NAME*"}
$key = get-content $localtemp | where {$_ -like "Last 5*"} 
$key = foreach ($item in $key){
    ($item -split ' ')[7]} 


foreach ($item in $lic){
     ($item -split ' ')[4] | add-content -Path  $OfficLice.("License Name")

}

foreach ($item in $key){
    $item | add-content -Path $OfficLice.Key
}

这是我正在尝试清理的内容的副本

Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

---Processing--------------------------
---------------------------------------
PRODUCT ID: 00333-59056-17787-AA631
SKU ID: 522f8458-7d49-42ff-a93b-670f6b6176ae
LICENSE NAME: Office 16, Office16HomeBusinessR_Retail3 edition
LICENSE DESCRIPTION: Office 16, RETAIL channel
LICENSE STATUS:  ---LICENSED--- 
Last 5 characters of installed product key: 7H67X
---------------------------------------
PRODUCT ID: 00340-00000-00000-AA482
SKU ID: 971cd368-f2e1-49c1-aedd-330909ce18b6
LICENSE NAME: Office 16, Office16SkypeforBusinessEntryR_PrepidBypass edition
LICENSE DESCRIPTION: Office 16, RETAIL(Free) channel
LICENSE STATUS:  ---LICENSED--- 
ERROR CODE: 0x4004FC05 (for information purposes only as the status is licensed)
ERROR DESCRIPTION: The Software Licensing Service reported that the application has a perpetual grace period.
Last 5 characters of installed product key: HT9YM
---------------------------------------
PRODUCT ID: 00198-20000-00000-AA054
SKU ID: ff693bf4-0276-4ddb-bb42-74ef1a0c9f4d
LICENSE NAME: Office 15, OfficeLyncEntryR_PrepidBypass edition
LICENSE DESCRIPTION: Office 15, RETAIL(Free) channel
LICENSE STATUS:  ---LICENSED--- 
ERROR CODE: 0x4004FC05 (for information purposes only as the status is licensed)
ERROR DESCRIPTION: The Software Licensing Service reported that the application has a perpetual grace period.
Last 5 characters of installed product key: BPW98
---------------------------------------
---------------------------------------
---Exiting-----------------------------

【问题讨论】:

    标签: powershell csv scripting text-parsing


    【解决方案1】:

    这是一个简化的解决方案,它使用 switch 语句处理具有正则表达式匹配的输入对象的数组(作为奖励, switch 也明显比管道解决方案快):

    $comp = "Computername"
    $OfficLice = "C:\share\OfficLice.csv"
    
    & { 
      switch -regex (cscript 'C:\Program Files (x86)\Microsoft Office\Office16\ospp.vbs' /dstatus $comp) {
        '^LICENSE NAME: (.*)' { 
            # Create a new custom object, filled with just the license name
            # for now.
            $o = [pscustomobject] @{
                Lic = $Matches[1]
                Key = ''
            }
        }
        '^Last 5 characters of installed product key: (.*)' { 
            # Add the license key info...
            $o.Key = $Matches[1] 
            # ... and output the complete object
            $o
        }
      }
    } | Export-Csv -NoTypeInformation $OfficLice
    

    注意Export-Csv默认使用ASCII编码;如果需要,请使用-Encoding 参数。

    使用您的示例输入,生成的 CSV 文件如下所示:

    "Lic","Key"
    "Office 16, Office16HomeBusinessR_Retail3 edition","7H67X"
    "Office 16, Office16SkypeforBusinessEntryR_PrepidBypass edition","HT9YM"
    "Office 15, OfficeLyncEntryR_PrepidBypass edition","BPW98"
    
    • switch -regex (...) 运行外部 cscript 命令并单独处理每个生成的输出行。

    • 由于-regex,分支条件被解释为正则表达式。

    • 类似于使用-match运算符,正则表达式实际捕获记录在自动$Matches变量中,其索引为1的条目包含1st 捕获的正则表达式 ((...)) 中的捕获组 - 在我们的例子中,分别是许可证名称和许可证密钥。

    • 第一个分支处理程序用许可证名称初始化每个输出对象,第二个分支处理程序添加许可证密钥信息,然后输出对象。

    • switch 语句的整体输出是所有输出对象的数组,其元素一一传递到Export-Csv

      • 请注意,将 switch 语句包含在 & { ... } 中 - 即通过 脚本块 调用 - 是能够在管道中使用它的必要条件。

    【讨论】:

      【解决方案2】:

      即使你我不太喜欢你尝试解决这个特殊情况的方式,这里是你的代码更新,希望能提供预期的结果。

      $comp = "Computername"
      $OfficLice = "C:\share\OfficLice.csv"
      
      $localtemp = cscript 'C:\Program Files (x86)\Microsoft Office\Office16\ospp.vbs' /dstatus $comp
      
      $filteredOutput = $localtemp | Where-Object {($_ -like "License Name*") -or ($_ -like "Last 5*")}
      
      $licenseInformation = @()
      
      for ($i = 0; $i -lt $filteredOutput.Count; $i = $i + 2) {
          $combinedLicenseInformation = [PSCustomObject]@{
            LicenseName = ($filteredOutput[$i] -split ' ')[4];
            Last5Characters = ($filteredOutput[$i + 1] -split ' ')[7]
          }
          $licenseInformation += $combinedLicenseInformation
      }
      
      $licenseInformation | Export-Csv -Path $OfficLice -NoTypeInformation
      

      周末愉快!

      【讨论】:

        猜你喜欢
        • 2020-09-01
        • 2012-12-08
        • 2012-11-13
        • 2019-08-01
        • 1970-01-01
        • 2021-04-08
        • 2018-07-18
        • 2020-10-06
        • 1970-01-01
        相关资源
        最近更新 更多