2017-07-18 14 views
1

ログエントリを含むCSVファイルのフォルダがあります。 CSVの各エントリについて、RiskプロパティがLowでなくNoneでない場合、私はそれを蓄積CSVオブジェクトに入れます。そこから、ファイルをに保存せずに、Excelワークブックに直接インポートします。ExcelワークブックにCSVを渡す(ファイルではない)

$CSVPaths = (Split-Path $PSCommandPath) 
$AccumulateExportPath = (Split-Path $PSCommandPath) 
$FileName="Accumulate" 
[email protected]() 

Foreach ($csv in (Get-ChildItem C:\Scripts\Nessus\Sheets |? {$_.Extension -like ".csv" -and $_.BaseName -notlike "$FileName"})) 
{ 
    $Content = Import-CSV $csv.FullName 
    Foreach ($Log in $Content) 
    { 
     If ($Log.Risk -ne "None" -and $Log.Risk -ne "Low") 
     { 
      $Acc+=$Log 
     } 
    } 
} 

$CSV = $ACC |ConvertTo-CSV -NoTypeInformation 

Add-Type -AssemblyName Microsoft.Office.Interop.Excel 
$Script:Excel = New-Object -ComObject Excel.Application 
$Excel.Visible=$True 
#$Excel.Workbooks.OpenText($CSV) What should replace this? 

私はCSVファイルにファイルパスするのではなく、CSV オブジェクトを渡したりすることができますOpenText()のような方法がありますよ私は自分の変換関数を記述しているつもり?

+1

一時ファイルとしてcsvを保存しないのはなぜですか。私には一番簡単な方法だと思う。 – FunThomas

+0

@FunThomas私にCSVオブジェクトを渡す機能がある場合、なぜ一時ファイルを作成するのですか?それを実行できる機能がない場合は、一時ファイルを使用します。 –

+1

スクリプト担当者がプラグインを作成しましたが、それが終わりに使用するのが簡単かどうかはわかりません。 https://blogs.technet.microsoft.com/heyscriptingguy/2015/11/25/introducing-the-powershell-excel-module-2/を参照してください。 – FunThomas

答えて

1

興味深い質問。私はCSV オブジェクトを渡すことができる方法を知らない。あなたの結果CSVが大きすぎないで、あなたが文字列レバレッジここSet-Clipboardmore info

$headers = ($csv | Get-Member | Where-Object {$_.MemberType -eq "NoteProperty"}).Name 
$delim = "`t" 

# headers 
foreach($header in $headers){ 
    $myString += $header + $delim 
} 

# trim delimiter at the end, and add new line 
$myString = $myString.TrimEnd($delim) 
$myString = $myString + "`n" 

# loop over each line and repeat 
foreach($line in $csv){ 
    foreach($header in $headers){ 
     $myString += $line.$header + $delim 
    } 
    $myString = $myString.TrimEnd($delim) 
    $myString = $myString + "`n" 
} 

# copy to clipboard 
Set-Clipboard $myString 

# paste into excel from clipboard 
$Excel.Workbooks.Worksheets.Item(1).Paste() 
0

にオブジェクトを変換することができ5.0+あなたはPowerShellを使用している場合

ただし、作成するための別の方法があります.csvファイルを作成せずにPowerShellのExcelスプレッドシート。

$dirs = 'C:\src\t', 'C:\src\sql' 

$records = $() 
$records = foreach ($dir in $dirs) { 
    Get-ChildItem -Path $dir -File '*.txt' -Recurse | 
     Select-Object @{Expression={$_.FullName}; Label="filename"} 
    } 

#open excel 
$excel = New-Object -ComObject excel.application 
$excel.visible = $false 

#add a default workbook 

$workbook = $excel.Workbooks.Add() 
#remove worksheet 2 & 3 

$workbook.Worksheets.Item(3).Delete() 
$workbook.Worksheets.Item(2).Delete() 

#give the remaining worksheet a name 
$uregwksht = $workbook.Worksheets.Item(1) 
$uregwksht.Name = 'File Names' 

# Start on row 1 
$i = 1 

# the .appendix to $record refers to the column header in the csv file 
foreach ($record in $records) { 
    $excel.cells.item($i,1) = $record.filename 
    $i++ 
} 

#adjusting the column width so all data's properly visible 
$usedRange = $uregwksht.UsedRange 
$usedRange.EntireColumn.AutoFit() | Out-Null 

#saving & closing the file 
$outputpath = Join-Path -Path $Env:USERPROFILE -ChildPath "desktop\exceltest.xlsx" 
$workbook.SaveAs($outputpath) 
$excel.Quit() 
関連する問題