PowerShell - [решено] Узнать сумму аптаймов за последнюю неделю

Аватара пользователя
Griboed0ff

Re: PowerShell - [решено] Узнать сумму аптаймов за последнюю неделю

Сообщение Griboed0ff »

ничего нигде сбиваться не должно



Код:

Код: Выделить всё

$hashtable        = [Ordered]@{}
$Name             = 'C'
$Value            = 'B'
$hashtable[$Name] = $Value
$Name             = 'D'
$Value            = 'A'
$hashtable[$Name] = $Value
$hashtable|fl
$ohash = [PSCustomObject]$hashtable
$ohash|fl
Аватара пользователя
Griboed0ff

Re: PowerShell - [решено] Узнать сумму аптаймов за последнюю неделю

Сообщение Griboed0ff »

Цитата alpap:



ничего нигде сбиваться не должно
PowerShell - [решено] Узнать сумму аптаймов за последнюю неделю




Либо я не понял вас, либо вы не вникли.

привожу пример:



Код:

Код: Выделить всё

$dates = @(0..7) # диапозон дат, тут могу вставить любое количество дат
$hashtable = [ordered]@{computername = $env:COMPUTERNAME}
foreach ($date in $dates){
$0 # имя столбца, в каждой итерации разное, то есть их может быть от 1 до бесконечности
$4 # значение столбца $0 в этой итерации
$hashtable.Add($0,$4) # добавляю в таблицу столбец со значением
}
$hashtable # получаю правильную таблицу, с нужным порядком

Правильная таблица - одна строка, начинается с имени пк, далее множество столбцов с датами в именах столбцов и значениями в строке, расположенных по порядку добавления в таблицу.

Но когда я выполняю код на удаленном пк через invoke и получаю таблицу, то порядок столбцов меняется на такой как будь-то я не проставил ordered перед созданием таблицы, пример:



Код:

Код: Выделить всё

$s = New-PSSession $comp # создаю сессию, в которой буду выполнять код
Invoke-Command -Session $s { # далее сам выполняемый код
$dates = @(0..7) # диапозон дат, тут могу вставить любое количество дат
$hashtable = [ordered]@{computername = $env:COMPUTERNAME}
foreach ($date in $dates){
$0 # имя столбца, в каждой итерации разное, то есть их может быть и от 1 до бесконечности
$4 # значение столбца $0 в этой итерации
$hashtable.Add($0,$4) # добавляю в таблицу столбец со значением
}}
$table = Invoke-Command -Session $s {$hashtable} # запрашиваю таблицу из сессии от удаленного пк 
$table # таблица с неправильным порядком столбцов.

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

То есть таблица ломается именно тут:



Код:

Код: Выделить всё

$table = Invoke-Command -Session $s {$hashtable}
Аватара пользователя
alpap

Re: PowerShell - [решено] Узнать сумму аптаймов за последнюю неделю

Сообщение alpap »

ну тогда просто отсортируйте как вам надо:



Код:

Код: Выделить всё

$hashTable = @{
 Name1 = 'ValueA'
 Name2 = 'ValueB'
 Name3 = 'ValueC'
}
$hashTable
'---'
$hashTable.GetEnumerator()|% {'{0} {1}' -f $_.Key, $_.Value}|sort
'---'
$m1 = $hashTable.Keys|foreach {$_}|sort
$m2 = $hashTable.Values|foreach {$_}|sort -desc
for ($i=0; $i -lt $m1.count; $i++) {
  $m1[$i]+' = '+$m2[$i]
}
Аватара пользователя
Griboed0ff

Re: PowerShell - [решено] Узнать сумму аптаймов за последнюю неделю

Сообщение Griboed0ff »

Остановился на своем варианте: передавать через invoke сессию не хеш таблицу, а pscustomobject, не сбивается сортировка.


Итоговый скрипт

[spoiler]Код:
[/spoiler]

Код: Выделить всё

$outfile = "D:\PowerShell\uptime\test.csv"
$comp = "r48-ser"
$s = New-PSSession $comp
Invoke-Command -Session $s {
$dates = @(0..7)
$hashtable = [ordered]@{computername = $env:COMPUTERNAME}
foreach ($date in $dates){
$0 = (Get-Date).AddDays(-$date).ToShortDateString()
$CurrentTime = [System.DateTime]::Parse(((Get-Date).AddDays(-$date)).ToString("yyyy.MM.dd"))
$Time = [System.Timespan]::Parse("00:00:01")
$adddate = $CurrentTime.Add($Time)
$CurrentTime2 = [System.DateTime]::Parse(((Get-Date).AddDays(-$date)).ToString("yyyy.MM.dd"))
$Time2 = [System.Timespan]::Parse("23:59:59")
$adddate2 = $CurrentTime2.Add($Time2)
$add = Get-Eventlog -logname System | Where-Object {$_.TimeGenerated.ToShortDateString() -eq $0}
$add1 = @([pscustomobject]@{Index='00000';EntryType='00000';InstanceId='00000';Message='00000';Category='00000';CategoryNumber='00000';ReplacementStrings='00000';Source='00000';TimeGenerated=$adddate;TimeWritten='00000';UserName='00000';})
$add2 = @([pscustomobject]@{Index='00000';EntryType='00000';InstanceId='00000';Message='00000';Category='00000';CategoryNumber='00000';ReplacementStrings='00000';Source='00000';TimeGenerated=$adddate2;TimeWritten='00000';UserName='00000';})
$1 = $add + $add1 + $add2 | Sort-Object {Get-Date $_.TimeGenerated} -Descending 
Clear-Variable -Name allsec, summ -Force -ErrorAction SilentlyContinue
$allsec = @(for ($index = 0; $index -lt $1.Count; $index++)
{if ($1.TimeGenerated[$index + 1] -ne $null -and $1.TimeGenerated[$index] -ne $1.TimeGenerated[$index + 1] ){
$2 = $1.TimeGenerated[$index] - $1.TimeGenerated[$index + 1]
if ($2.TotalSeconds -gt 5400){$2.TotalSeconds}}})
$allsec| foreach {$summ += $_}
$3 = ((86400 - $summ) - 2)
$ts =  [timespan]::fromseconds($3)
$4 = "{0:HH:mm:ss}" -f ([datetime]$ts.Ticks)
Write-Host $0 uptime $4
$hashtable.Add($0,$4)
$ps_object = [pscustomobject]$hashtable
}}
$table = Invoke-Command -Session $s {$ps_object}
$table |export-csv $outfile -notype -enc utf8 -d ';' -append
Аватара пользователя
Iska

Re: PowerShell - [решено] Узнать сумму аптаймов за последнюю неделю

Сообщение Iska »

Iska, не пользовался никогда. Как видите увлекаюсь индусским легаси кодом :D, но думаю это вылечится при постижении python и json!
Аватара пользователя
YuS_2

Re: PowerShell - [решено] Узнать сумму аптаймов за последнюю неделю

Сообщение YuS_2 »

Цитата Griboed0ff:



не пользовался никогда
PowerShell - [решено] Узнать сумму аптаймов за последнюю неделю




очень зря, причем в любом коде...
фолдинг
... кроме того, форматирование, тоже облегчает восприятие кода.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»