我目前有一个在PowerShell脚本中创建的5个注册表CSV文件:
我需要在脚本末尾打开这些CSV文件,但是如果所有这些文件都包含在一个包含5个不同标题的XLSX文件中
有没有办法通过PowerShell合并文件?
我了解如何获取CSV文件的数据,但不了解如何合并或转换。我认为可能有用的一些变量。
$Date = Get-Date -Format "d.MMM.yyyy"
$DIR = $WPFlistview.Selecteditem.Ransomware
$path = "F:\Registry_Export\Results\$DIR\$Date\*"
$csvs = Get-ChildItem $path -Include *.csv
$output = "F:\Registry_Export\Results\$DIR\$Date\Results.Xlsx"
如果需要,CSV文件的路径:
F:\Registry_Export\Results\$DIR\$Date\HKCR.CSV F:\Registry_Export\Results\$DIR\$Date\HKCU.CSV F:\Registry_Export\Results\$DIR\$Date\HKLM.CSV F:\Registry_Export\Results\$DIR\$Date\HKU.CSV F:\Registry_Export\Results\$DIR\$Date\HKCC.CSV
这是我之前尝试过的。然而,它完全将我的数据扰乱到错误的行和单元格中:
function MergeCSV {
$Date = Get-Date -Format "d.MMM.yyyy"
$DIR = $WPFlistview.Selecteditem.Ransomware
$path = "F:\Registry_Export\Results\$DIR\$Date\*"
$csvs = Get-ChildItem $path -Include *.csv
$y = $csvs.Count
Write-Host "Detected the following CSV files: ($y)"
foreach ($csv in $csvs) {
Write-Host " "$csv.Name
}
$outputfilename = "Final Registry Results"
Write-Host Creating: $outputfilename
$excelapp = New-Object -ComObject Excel.Application
$excelapp.SheetsInNewWorkbook = $csvs.Count
$xlsx = $excelapp.Workbooks.Add()
$sheet = 1
foreach ($csv in $csvs) {
$row = 1
$column = 1
$worksheet = $xlsx.Worksheets.Item($sheet)
$worksheet.Name = $csv.Name
$file = (Get-Content $csv)
foreach ($line in $file) {
$linecontents = $line -split ',(?!\s*\w+")'
foreach ($cell in $linecontents) {
$worksheet.Cells.Item($row,$column) = $cell
$column++
}
$column = 1
$row++
}
$sheet++
}
$output = "F:\Registry_Export\Results\$DIR\$Date\Results.Xlsx"
$xlsx.SaveAs($output)
$excelapp.Quit()
}
答案 0 :(得分:2)
所以,仍然使用Excel.Application ComObject,我建议将每个CSV加载为CSV,而不是像你一样使用Get-Content
。然后使用ConvertTo-CSV
cmdlet,指定使用tab作为分隔符,并将其复制到剪贴板。然后只需粘贴到Excel中,它就会很好地粘贴。您可能希望调整列大小,但数据将按照您的预期显示。我也会使用For
循环而不是ForEach
循环,因为Excel可以很好地使用标签的数字(虽然它是1而不是PowerShell' 0基础)。以下是进行这些修改后我最终会得到的结果:
function MergeCSV {
$Date = Get-Date -Format "d.MMM.yyyy"
$DIR = $WPFlistview.Selecteditem.Ransomware
$path = "F:\Registry_Export\Results\$DIR\$Date\*"
$csvs = Get-ChildItem $path -Include *.csv
$y = $csvs.Count
Write-Host "Detected the following CSV files: ($y)"
Write-Host " "$csvs.Name"`n"
$outputfilename = "Final Registry Results"
Write-Host Creating: $outputfilename
$excelapp = New-Object -ComObject Excel.Application
$excelapp.SheetsInNewWorkbook = $csvs.Count
$xlsx = $excelapp.Workbooks.Add()
for($i=1;$i -le $y;$i++) {
$worksheet = $xlsx.Worksheets.Item($i)
$worksheet.Name = $csvs[$i-1].Name
$file = (Import-Csv $csvs[$i-1].FullName)
$file | ConvertTo-Csv -Delimiter "`t" -NoTypeInformation | Clip
$worksheet.Cells.Item(1).PasteSpecial()|out-null
}
$output = "F:\Registry_Export\Results\$DIR\$Date\Results.Xlsx"
$xlsx.SaveAs($output)
$excelapp.Quit()
}
答案 1 :(得分:0)
您可以使用ImportExcel
by Doug Finke然后将原始脚本中的Export-CSV
替换为Export-Excel -WorksheetName
Install-Module ImportExcel
Export-Excel "F:\Registry_Export\Results\$DIR\$Date\Results.xlsx" -worksheetname "HKCR"
Export-Excel "F:\Registry_Export\Results\$DIR\$Date\Results.xlsx" -worksheetname "HKCU"