2017-04-17 54 views
0

我現在有這是一個PowerShell腳本中創建5條登記CSV文件:合併CSV文件與選項卡的XLSX

  • 文化中心
  • HKCR
  • HKCU
  • HKLM
  • HKU

我需要這些CSV文件在腳本的末尾打開,但會l如果他們都包含在一個XLSX文件與5個不同的標題

有沒有辦法通過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() 
} 

的CSV如何看起來 https://gyazo.com/177c7c3bb21ddf06d0ebacbb7f4d537b

的XLSX如何看起來 https://gyazo.com/cd5fb48d61f93aac5ec3034d81811094

+0

嗨,歡迎來到Stack Overflow!雖然我們很高興看到新用戶並幫助他們解決編碼/腳本問題,但我們不是代碼編寫服務。請說明你爲了完成這一目標而嘗試過的,並且讓我們知道你在嘗試時遇到了什麼麻煩。我確信,一旦我們看到您嘗試過的東西,並提供更正,或者可能是更好的方式來實現您的目標,我們可以幫助您找出事情出錯的地方。 – TheMadTechnician

+0

謝謝,現在完成此操作,以提供更好的理解 – Weller

+0

這是完美的,謝謝!我會很快根據你在那裏爲你做的一個答案。 – TheMadTechnician

回答

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" 
1

因此,仍然使用Excel.Application ComObject,我建議將每個CSV加載爲CSV,而不是像您一樣使用Get-Content。然後使用ConvertTo-CSV cmdlet,指定使用製表符作爲分隔符,並將其複製到剪貼板。然後只需粘貼到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() 
}