Попытка использовать Powershell для импорта информации из csv, но, к сожалению, некоторые результаты оказываются неверными - PullRequest
0 голосов
/ 07 ноября 2018
$AuditSuccess = Import-Csv -Path G:\LabLog.csv | Where-Object { $_.Keywords -like "Audit Success" } | Measure-Object | Select-Object count 

$AuditFailure = Import-Csv -Path G:\LabLog.csv | Where-Object { $_.Keywords -like "Audit Failure" } | Measure-Object | Select-Object count

$AuditTotal = $AuditSuccess + $AuditFailure

$EventID1 = Import-Csv -Path G:\LabLog.csv | sort | group Keywords | sort $_.EventID | select EventID -last 1

$EventID2 = Import-Csv -Path G:\LabLog.csv | sort | group Keywords | sort $_.EventID | select EventID -last 1


Write-Host "Number of Audit Failures:" $AuditFailure "failures of" $AuditTotal "entries"
Write-Host "Most Common Event ID:" $EventID1
Write-Host "Number of Audit Successes:" $AuditSuccess "successes of" $AuditTotal "entries"
Write-Host "Most Common Event ID:" $EventID2 

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

Разделы AuditFailure и AuditSuccess этого кода работают несколько, хотя результаты выдаются как {count = ##}, а не просто числа. Настоящая проблема связана с AuditTotal и EventID, которые либо не дают никакого результата в случае итога, либо дают пустой результат в случае EventID.

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

Method invocation failed because [System.Management.Automation.PSObject] does 
not contain a method named 'op_Addition'.
At line:5 char:1
+ $AuditTotal = $AuditSuccess + $AuditFailure
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (op_Addition:String) [], 
RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

Number of Audit Failures: @{Count=13} failures of  entries
Most Common Event ID: @{EventID=}
Number of Audit Successes: @{Count=6480} successes of  entries
Most Common Event ID: @{EventID=}

Извините, это ошибка вывода

Number of Audit Failures: 2469 failures of 19247 entries                               
  Most common Event ID: 5038     
Number of Audit Successes: 16778 successes of 19247 entries                               
  Most common Event ID: 4624

Вот как это должно выглядеть, хотя цифры должны быть разными

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018
$AuditSuccess = Import-Csv -Path G:\LabLog.csv | Where-Object { $_.Keywords -like "Audit Success" } | Measure-Object | Select-Object -ExpandProperty count 

$AuditFailure = Import-Csv -Path G:\LabLog.csv | Where-Object { $_.Keywords -like "Audit Failure" } | Measure-Object | Select-Object -ExpandProperty count

$AuditTotal = $AuditSuccess + $AuditFailure

$EventID1 = Import-Csv -Path G:\LabLog.csv | Where-Object { $_.Keywords -like "Audit Success" } | sort $_.EventID | Select-Object -ExpandProperty EventID -last 1

$EventID2 = Import-Csv -Path G:\LabLog.csv | Where-Object { $_.Keywords -like "Audit Failure" } | sort $_.EventID | Select-Object -ExpandProperty EventID -last 1


Write-Host "Number of Audit Failures:" $AuditFailure "failures of" $AuditTotal "entries"
Write-Host "Most Common Event ID:" $EventID1
Write-Host "Number of Audit Successes:" $AuditSuccess "successes of" $AuditTotal "entries"
Write-Host "Most Common Event ID:" $EventID2 

Спасибо за помощь, вот ответ.

0 голосов
/ 07 ноября 2018

вот еще один способ избежать повторного чтения файла CSV много раз. он также избегает отправки сообщений через конвейер довольно так часто. [ ухмылка ]

# fake reading in a CSV file
#    in real life, use Import-CSV
$InStuff = @'
EventID, Keywords
1001, Audit Success; SomeOtherWord
1001, Audit Success
2002, NothingRightNow
3003, Audit Failure
4004, Audit Success
5005, IgnoreThisOne
6006, Audit Success
7007, Audit Failure
7007, Audit Failure
'@ | ConvertFrom-Csv

$SuccessList = $InStuff.Where({$_.Keywords -match 'success'})
$SuccessCount = $SuccessList.Count
$SL_MostFrequentEventID = ($SuccessList |
    Group-Object -Property EventID |
    Sort-Object -Property Count)[-1].Name


$FailureList = $InStuff.Where({$_.Keywords -match 'failure'})
$FailureCount = $FailureList.Count
$FL_MostFrequentEventID = ($FailureList |
    Group-Object -Property EventID |
    Sort-Object -Property Count)[-1].Name

$FS_TotalCount = $FailureCount + $SuccessCount

Write-Host ''
Write-Host ('Number of Audit Failures {0} out of {1} entries.' -f $FailureCount, $FS_TotalCount)
Write-Host ('    Most Common Failure Event ID = {0}' -f $FL_MostFrequentEventID)
Write-Host ('Number of Audit Successes {0} out of {1} entries.' -f $SuccessCount, $FS_TotalCount)
Write-Host ('    Most Common Success Event ID = {0}' -f $SL_MostFrequentEventID)

вывод ...

Number of Audit Failures 3 out of 7 entries.
    Most Common Failure Event ID = 7007
Number of Audit Successes 4 out of 7 entries.
    Most Common Success Event ID = 1001
0 голосов
/ 07 ноября 2018

В конечном итоге несколько проблем ; давайте начнем с основного :

$AuditTotal = $AuditSuccess + $AuditFailure

вызвало ошибку [System.Management.Automation.PSObject] does not contain a method named 'op_Addition', поскольку $AuditSuccess и $AuditFailure, значения которых были назначены с помощью Select-Object count, являются пользовательскими объектами , а не числами - и оператор + (который переводится в метод op_Addition) не определен для операндов пользовательских объектов (операнды типа [pscustomobject]).

Чтобы использовать Select-Object для извлечения одного свойства значение , вы должны использовать -ExpandProperty; например:

$AuditSuccess = ... | Measure-Object | Select-Object -ExpandProperty Count

Без -ExpandProperty, с (подразумеваемым) параметром -Property вы получите [pscustomobject] экземпляр , который имеет одно свойство, .Count.


Следующая проблема заключается в том, что sort $_.EventID не будет работать должным образом , поскольку автоматическая переменная $_ имеет только (значащее) значение в блоках сценариев ; без предопределенного значения $_ (их не должно быть), $_.EventId оценивается как $null и фактически игнорируется .

Хотя Sort-Object EventId обычно является правильным решением (просто предоставив свойство name ), в этом случае входные объекты не имеют свойство .EventId, потому что Выходные данные group (Group-Object) - это [Microsoft.PowerShell.Commands.GroupInfo] экземпляров, каждый из которых представляет группу исходных входных объектов.

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

$EventID1 = Import-Csv -Path G:\LabLog.csv | 
  Where-Object { $_.Keywords -like "Audit Success" } | 
    Group-Object EventID |
      Sort-Object Count -Descending |
        Select-Object -ExpandProperty Values -First 1

То есть входные объекты сначала фильтруются по ключевому слову, затем группируются по идентификатору события, затем сортируются по количеству объектов в каждой группе с идентификатором события, причем идентификатор события группы возвращается с наибольшим количеством записей.

Наконец:

...