合并多行文本以形成 CSV 文件的每一行
Combine text from multiple lines to form each row of a CSV file
我正在尝试清理
的输出
cscript 'C:\Program Files (x86)\Microsoft Office\Office16\ospp.vbs' /dstatus
我只想显示许可证和密钥的最后 5 个字符,例如
Office16HomeBusinessR_Retail3 edition , 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-----------------------------
这是一个简化的解决方案,它使用 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
语句包含在 & { ... }
中 - 即通过 脚本块调用 - 是能够在管道。
虽然我不太喜欢你尝试解决这个特殊案例的方式,但这里是你的代码更新,希望能提供预期的结果。
$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
周末愉快!
我正在尝试清理
的输出cscript 'C:\Program Files (x86)\Microsoft Office\Office16\ospp.vbs' /dstatus
我只想显示许可证和密钥的最后 5 个字符,例如
Office16HomeBusinessR_Retail3 edition , 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-----------------------------
这是一个简化的解决方案,它使用 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
语句包含在& { ... }
中 - 即通过 脚本块调用 - 是能够在管道。
- 请注意,将
虽然我不太喜欢你尝试解决这个特殊案例的方式,但这里是你的代码更新,希望能提供预期的结果。
$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
周末愉快!