micneu
Goto Top

Powershell Laufzeit Funktion

Moin,

ich habe eine Powershell Funktion die für mich die Laufzeit eines Scriptes zeigt.

Wenn ich mein Script laufen lasse z. B. 29 Sekunden kommt auch ein Korrektes Ergebnis.
gelaufenezeit_SEK: 29,001576
Minuten: 0
SEKUNDEN_REST: 29,001576
Auftrag nach 29,00 Sek. erledigt....
Wenn ich es mit 30 Sekunden laufen Lasse:
gelaufenezeit_SEK: 30,001482
Minuten: 1
SEKUNDEN_REST: -29,998518
Auftrag nach 30,00 Sek. erledigt....

30 Sekunden sind doch weniger als 1 Minute?
Getestet mit Windows 10 Pro und macOS 13 (Powershell 7.3)

Hier mein Code:
function timepost{
    $gelaufenezeit_SEK = ($stop - $start).TotalSeconds
    'gelaufenezeit_SEK: {0}' -f $gelaufenezeit_SEK  
    $MINUTEN = [INT]($stop - $start).TotalMinutes
    'Minuten: {0}' -f $MINUTEN  
    $SEKUNDEN_REST = (($stop - $start).TotalSeconds - ($MINUTEN*60))
    'SEKUNDEN_REST: {0}' -f $SEKUNDEN_REST  

    If (($stop - $start).TotalSeconds -ge 60){
        $MINUTEN = [INT]($stop - $start).TotalMinutes
        $SEKUNDEN_REST = (($stop - $start).TotalSeconds - ($MINUTEN*60))
        $MINSEK = "Min."  
        Write-Host -BackgroundColor Black -ForegroundColor Green ('Auftrag nach {0}:{1} {2} erledigt....' -f $MINUTEN, [INT]$SEKUNDEN_REST, $MINSEK)  
        }
    Else {
        $MINSEK = "Sek."  
        Write-Host -BackgroundColor Black -ForegroundColor Green ('Auftrag nach {0:0.00} {1} erledigt....' -f $gelaufenezeit_SEK, $MINSEK)  
        }   
}
$start = (get-date)
Start-Sleep -Seconds 30
$stop = (get-date)
timepost

Content-ID: 4663291955

Url: https://administrator.de/contentid/4663291955

Ausgedruckt am: 05.11.2024 um 07:11 Uhr

TK1987
Lösung TK1987 17.11.2022 aktualisiert um 11:04:04 Uhr
Goto Top
Moin,

Zitat von @micneu:
Wenn ich mein Script laufen lasse z. B. 29 Sekunden kommt auch ein Korrektes Ergebnis.

Wenn ich es mit 30 Sekunden laufen Lasse:

30 Sekunden sind doch weniger als 1 Minute?
.TotalMinutes wird als Dezimalzahl ausgegeben, bei über 30 Sekunden also >0.5
Wandelst du das einfach nur in [int] um, wird natürlich auf 1 aufgerundet.

Daher:
$MINUTEN = [Math]::Floor(($stop - $start).TotalMinutes)

Allerdings die Frage: Wieso nimmst du nicht statt TotalMinutes einfach Minutes und statt TotalSeconds dann einfach Seconds - so brauchst du auch nicht mehr zu rechnen.

Siehe auch die Beispiele in der Hilfe zu New-TimeSpan
$stop - $start | Select Days,Hours,Minutes,Seconds | Format-List

Gruß Thomas
micneu
Lösung micneu 17.11.2022 um 11:39:17 Uhr
Goto Top
Danke, das war die Lösung (ich kannte die Minutes nicht)
function timepost{
    $gelaufenezeit_SEK = ($stop - $start).Seconds
    #'gelaufenezeit_SEK: {0}' -f $gelaufenezeit_SEK 
    $MINUTEN = ($stop - $start).Minutes
    #'Minuten: {0}' -f $MINUTEN 
    $SEKUNDEN_REST = (($stop - $start).Seconds)
    #'SEKUNDEN_REST: {0}' -f $SEKUNDEN_REST 

    If (($stop - $start).Minutes -ge 1){
        $MINUTEN = ($stop - $start).Minutes
        #$SEKUNDEN_REST = (($stop - $start).Seconds - (($MINUTEN*60)))
        $MINSEK = "Min."  
        Write-Host -BackgroundColor Black -ForegroundColor Green ('Auftrag nach {0},{1} {2} erledigt....' -f $MINUTEN, $SEKUNDEN_REST, $MINSEK)  
        }
    Else {
        $MINSEK = "Sek."  
        Write-Host -BackgroundColor Black -ForegroundColor Green ('Auftrag nach {0:0.00} {1} erledigt....' -f $SEKUNDEN_REST, $MINSEK)  
        }   
}
$start = (get-date)
Start-Sleep -Seconds 145
$stop = (get-date)
timepost
4400667902
4400667902 17.11.2022 um 11:47:18 Uhr
Goto Top
Nur falls es nicht bekannt sein sollte
Measure-Command