Показать полную графическую версию : [решено] Узнать сумму аптаймов за последнюю неделю
ничего нигде сбиваться не должно
$hashtable = [Ordered]@{}
$Name = 'C'
$Value = 'B'
$hashtable[$Name] = $Value
$Name = 'D'
$Value = 'A'
$hashtable[$Name] = $Value
$hashtable|fl
$ohash = [PSCustomObject]$hashtable
$ohash|fl
Griboed0ff
08-10-2021, 18:27
ничего нигде сбиваться не должно »
Либо я не понял вас, либо вы не вникли.
привожу пример:
$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}
ну тогда просто отсортируйте как вам надо:
$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
17-11-2021, 08:58
Остановился на своем варианте: передавать через invoke сессию не хеш таблицу, а pscustomobject, не сбивается сортировка. $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';UserNa me='00000';})
$add2 = @([pscustomobject]@{Index='00000';EntryType='00000';InstanceId='00000';Message='00000';Category='00000';CategoryNumber ='00000';ReplacementStrings='00000';Source='00000';TimeGenerated=$adddate2;TimeWritten='00000';UserN ame='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
Griboed0ff, коллега, фолдинг — не наш метод?
Griboed0ff
23-11-2021, 19:55
Iska, не пользовался никогда. Как видите увлекаюсь индусским легаси кодом :D, но думаю это вылечится при постижении python и json!
не пользовался никогда »
очень зря, причем в любом коде... фолдинг (https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D0%BE%D1%80%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D 1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B 8%D0%B5))... кроме того, форматирование, тоже облегчает восприятие кода.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.