it-frosch
Goto Top

Funktion akzeptiert keinen Zeitstempel als Parameter - was mache ich falsch ?

Hallo erfahrenere Powershell Scripter,

ich arbeite gerade mit eine API die ein Abfragelimit vom 100 Abfragen/min hat.

Im ersten Schritt habe ich mir meine aktuelle Abfragerate errechnet:

$startzeit = get-Date
$request_count = 0
$rate_limit = 90
ForEach ($dat in $ergebnis) {
...
# Rate Limit auswerten
# aktuellen Zeitstempel ermitteln
$laufzeit = get-Date

# falls noch kein API Request ausgeführt auf 1 setzen
if ($request_count -eq 0) {$request_count = 1}

# Zeitdifferenz errechnen
$zeitdiff = New-TimeSpan -Start $startzeit -End $laufzeit

# falls Zeitdifferenz 0 ergibt auf 30 sek setzen
if ($zeitdiff.totalseconds -eq 0) {$zeitdiff.totalseconds = 30}

# Abfragen pro min errechnen
$rate = [math]::Round(($request_count/($zeitdiff.totalseconds/60)),2)

# Pause von 20 sek einfügen wenn aktuell Rate größer als Limit
if ($rate -ge $rate_limit) {
Write-Log -text "Das Rate Limit von $($rate_limit) Abfragen pro min wurde erreicht und das Script pausiert jetzt 20s."   
Write-Log-Main -text "Das Rate Limit von $($rate_limit) Abfragen pro min wurde erreicht und das Script pausiert jetzt 20s."  
Start-Sleep -Seconds 20
}
else
{
Write-Log -text "Die Abfragerate beträgt $rate Abfragen pro min, das Limit beträgt 100."  
Write-Log-Main -text "Die Abfragerate beträgt $rate Abfragen pro min, das Limit beträgt 100."  
}



API Request
}

Da ich diesen Codeblock mehrfach verwende, wollte ich das in eine Funktion auslagern.
function rate_ermitteln([Datetime]$startzeit,$request_count) {
    # Rate Limit auswerten
    $laufzeit = get-Date
    if ($request_count -eq 0) {$request_count = 1}
    $zeitdiff = New-TimeSpan -Start $startzeit -End $laufzeit
    if ($zeitdiff.TotalSeconds -eq 0) {$zeitdiff.TotalSeconds = 30}
    $rate = [math]::Round(($request_count/($zeitdiff.TotalSeconds/60)),2)
            
    # Pause von 20 sek einfügen
    if ($rate -ge $rate_limit) {
        Write-Log -text "Das Rate Limit von $($rate_limit) Abfragen pro min wurde erreicht und das Script pausiert jetzt 20s."  
        Write-Log-Main -text "Das Rate Limit von $($rate_limit) Abfragen pro min wurde erreicht und das Script pausiert jetzt 20s."  
        Start-Sleep -Seconds 20
    }
    else
    {
        Write-Log -text "Die Abfragerate beträgt $rate Abfragen pro min, das Limit beträgt 100."  
        Write-Log-Main -text "Die Abfragerate beträgt $rate Abfragen pro min, das Limit beträgt 100."  
    }

Wenn ich jetzt allerdings die Funktion aufrufe mit
rate_ermitteln($startzeit,$request_count)

Bekomme ich die Meldung:
rate_ermitteln : Die Argumenttransformation für den Parameter "startzeit" kann nicht verarbeitet werden. Der Wert "System.Object[]" vom Typ "System.Object[]" kann nicht in den Typ   
"System.DateTime" konvertiert werden.  
In Zeile:30 Zeichen:23
+         rate_ermitteln($startzeit,$request_count)
+                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [rate_ermitteln], ParameterBindingArgumentTransformationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,rate_ermitteln

Hier stehe ich aktuell auf dem Schlauch und habe keine Idee wie ich das Problem lösen kann.

Es wäre toll wenn mir hier jemand aufs Pferd helfen könnte.

Grüße vom it-frosch

Content-ID: 82300924084

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

Ausgedruckt am: 03.12.2024 um 17:12 Uhr

em-pie
em-pie 30.05.2024 um 13:48:39 Uhr
Goto Top
Moin,

Wenn ich jetzt allerdings die Funktion aufrufe mit

hast du geprüft, was in der $startzeit vor dem Aufruf der Funktion drinsteht?

Also vor dem Aufruf einfach mal ein
Write-Host "Startzeit: $startzeit"
Hinschrieben.

Nicht, dass deine Variable leer ist face-wink
13034433319
Lösung 13034433319 30.05.2024 aktualisiert um 14:03:13 Uhr
Goto Top
Eigene Funktionen werden in PS anders aufgerufen, nämlich wie cmdlets, also so
rate_ermitteln $startzeit $request_count
Oder mit ParameterNennung
rate_ermitteln -startzeit $startzeit -request_count $request_count

Mit deiner Klammerung machst du die beiden Variablen nämlich zum Inhalt des ersten Parameters, deswegen auch die Meldung von wegen Object[] im ersten Parameter.
😉

Gruß
it-frosch
it-frosch 30.05.2024 um 13:58:57 Uhr
Goto Top
@em-pie

nein, die Variable $startzeit wird vor dem Aufrufe der Funktion gesetzt.

Leider, darauf war ich auch schon gekommen. :D
11020714020
11020714020 30.05.2024 um 14:08:07 Uhr
Goto Top
Mal was anderes:

wieso übergibst du Request_Count als Variable, der Sinn der Funktion ist doch, dass genau die den Request_Count ermittelt.
it-frosch
it-frosch 30.05.2024 um 14:24:55 Uhr
Goto Top
Zitat von @13034433319:

Vielen Dank für den Volltreffer und die super Erklärung.

Jetzt läuft es wie es soll und ich habe wieder etwas gelernt. face-smile


Grüße vom it-frosch
it-frosch
it-frosch 30.05.2024 um 14:27:34 Uhr
Goto Top
Zitat von @11020714020:

Mal was anderes:
wieso übergibst du Request_Count als Variable, der Sinn der Funktion ist doch, dass genau die den Request_Count
ermittelt.

Der Sinn der Funktion ist, dass sie mir die Abfragerate in Abfragen pro Minute ermittelt.
Deshalb übergebe ich die Variable request_count die mit jedem durchgeführten API Request in der ForEach Schleife hochgezählt und in der Funktion durch die abgelaufene Zeit in Minuten dividiert wird.

Jetzt verständlich?

Grüße vom it-frosch