Соответствующие переменные подсчета Powershell в одном столбце - PullRequest
0 голосов
/ 10 октября 2018

У меня есть этот CSV-файл, с которым я довольно много работаю.Моя последняя задача - добавить сводный лист.

С учетом сказанного у меня есть файл CSV, который я извлекаю с веб-сайта и отправляю через множество проверок.Код ниже:

$Dups = import-csv 'C:\Working\cylrpt.csv' | Group-Object -Property 'Device Name'| Where-Object {$_.count -ge 2} | ForEach-Object {$_.Group} | Select @{Name="Device Name"; Expression={$_."Device Name"}},@{Name="MAC"; Expression={$_."Mac Addresses"}},Zones,@{Name="Agent"; Expression={$_."Agent Version"}},@{Name="Status"; Expression={$_."Is online"}}
$Dups | Export-CSV $working\temp\01-Duplicates.csv -NoTypeInformation
$csvtmp = Import-CSV $working\cylrpt.csv | Select @{N='Device';E={$_."Device Name"}},@{N='OS';E={$_."OS Version"}},Zones,@{N='Agent';E={$_."Agent Version"}},@{N='Active';E={$_."Is Online"}},@{N='Checkin';E={[DateTime]$_."Online Date"}},@{N='Checked';E={[DateTime]$_."Offline Date"}},Policy
$csvtmp | %{
    if ($_.Zones -eq ""){$_.Zones = "Unzoned"}
    }
$csvtmp | Export-Csv $working\cy.csv -NoTypeInformation
import-csv $working\cy.csv | Select Device,policy,OS,Zones,Agent,Active,Checkin,Checked | % {
    $_ | Export-CSV -path $working\temp\$($_.Zones).csv -notypeinformation -Append
    }
  1. Первая проверка для дубликатов, я использовал отдельные строки кода для этого, потому что я хотел создать CSV для дубликатов.
  2. Вторая проверка засыпоквсе пустые ячейки под столбцом Zones с «UnZoned»
  3. Третье, что нужно сделать, - это пройти через весь файл CSV и создать файл CSV для каждой зоны

Так что это мойбаза.Мне нужно добавить еще один CSV-файл для краткого изложения информации о зоне.Зоны имеют формат XXX-WS или XXX-SRV, где XXX может содержать от 3 до 17 букв.

Мне бы хотелось, чтобы сводный лист выглядел следующим образом

ABC         ###
ABC-WS      ##
ABC-SRV     ##

DEF         ###
DEF-WS      ##
DEF-SRV     ##

Мои мысли состоят в том, чтобы либо подсчитать исходный CSV-файл, либо подсчитать количество строк в каждом CSV-файле и вычесть 1 для строки заголовка.

Теперь зоны являются динамическими, поэтому я не могу простоскажем, я хочу ZONE XYZ, потому что эта зона может не существовать.

Итак, мне нужно иметь возможность подсчитать аналогичный тип зоны в исходном файле и вывести его в массив или файл, что быбыть моим предпочтительным методом, чтобы дать количество элементов с одинаковым именем зоны.Я просто не знаю, как написать это для поиска и подсчета соответствующих переменных.Вот код, который я пытаюсь использовать для подсчета:

import-csv C:\Working\cylrpt.csv | Group-Object -Property 'Zones'| ForEach-Object {$_.Group} | Select @{N='Device';E={$_."Device Name"}},Zones | % {
$Znum = ($_.Zones).Count
   If ($Znum -eq $null) {
            $Znum = 1
        } else {
            $Znum++
    }

}
$Count = ($_.Zones),$Znum | Out-file C:\Working\Temp\test2.csv -Append

Вот полный код минус ключ отчета:

$cylURL = "https://protect.cylance.com/Reports/ThreatDataReportV1/devices/"
$working = "C:\Working"
Remove-item -literalpath "\\?\C:\Working\Cylance Report.xlsx"
Invoke-WebRequest -Uri $cylURL -outfile $working\cylrpt.csv
$Dups = import-csv 'C:\Working\cylrpt.csv' | Group-Object -Property 'Device Name'| Where-Object {$_.count -ge 2} | ForEach-Object {$_.Group} | Select @{Name="Device Name"; Expression={$_."Device Name"}},@{Name="MAC"; Expression={$_."Mac Addresses"}},Zones,@{Name="Agent"; Expression={$_."Agent Version"}},@{Name="Status"; Expression={$_."Is online"}}
$Dups | Export-CSV $working\temp\01-Duplicates.csv -NoTypeInformation
$csvtmp = Import-CSV $working\cylrpt.csv | Select @{N='Device';E={$_."Device Name"}},@{N='OS';E={$_."OS Version"}},Zones,@{N='Agent';E={$_."Agent Version"}},@{N='Active';E={$_."Is Online"}},@{N='Checkin';E={[DateTime]$_."Online Date"}},@{N='Checked';E={[DateTime]$_."Offline Date"}},Policy
$csvtmp | %{
    if ($_.Zones -eq ""){$_.Zones = "Unzoned"}
    }
$csvtmp | Export-Csv $working\cy.csv -NoTypeInformation
import-csv $working\cy.csv | Select Device,policy,OS,Zones,Agent,Active,Checkin,Checked | % {
    $_ | Export-CSV -path $working\temp\$($_.Zones).csv -notypeinformation -Append
    }

cd $working\temp;
Rename-Item "Unzoned.csv" -NewName "02-Unzoned.csv"
Rename-Item "Systems-Removal.csv" -NewName "03-Systems-Removal.csv"
$CSVFiles = Get-ChildItem -path $working\temp -filter *.csv 
$Excel = "$working\Cylance Report.xlsx"
$Num = $CSVFiles.Count
Write-Host "Found the following Files:  ($Num)"

ForEach ($csv in $CSVFiles) {
    Write-host "Merging $CSVFiles.Name"
}
    $EXc1 = New-Object -ComObject Excel.Application
    $Exc1.SheetsInNewWorkBook = $CSVFiles.Count
    $XLS = $EXc1.Workbooks.Add()
    $Sht = 1
ForEach ($csv in $CSVFiles) {
    $Row = 1
    $Column = 1
    $WorkSHT = $XLS.WorkSheets.Item($Sht)
    $WorkSHT.Name = $csv.Name -Replace ".csv",""
    $File = (Get-Content $csv)
    ForEach ($line in $File) {
        $LineContents = $line -split ',(?!\s*\w+")'
        ForEach ($Cell in $LineContents) {
            $WorkSHT.Cells.Item($Row,$Column) = $Cell -Replace '"',''
            $Column++
        }
        $Column = 1
        $Row++
    }
    $Sht++
}
$Output = $Excel
$XLS.SaveAs($Output)
$EXc1.Quit()
Remove-Item *.csv
cd ..\

1 Ответ

0 голосов
/ 10 октября 2018

Нашли решение

$Zcount = import-csv C:\Working\cylrpt.csv | where Zones -ne "$null" | select @{N='Device';E={$_."Device Name"}},Zones | group Zones | Select Name,Count
$Zcount | Export-Csv -path C:\Working\Temp\01-Summary.csv -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...