Stoic
Stoic

Reputation: 27

Powershell keep looping until condition is true then proceed

I have written a script that so far is able to check a file "latest.json" for the "created_at" object which shows the last date that a commit has occurred for software.

 $websiteJson = Invoke-WebRequest "https://website/latest.json" | ConvertFrom-Json  | select created_at

$todaysDate = Get-Date -Format "yyyy-MM-dd HH:mm" 

if($websitejson.created_at | where {$_.created_at -eq $todaysDate}){
Write-Output "Today's date matches"

} else {
    Write-Output "has not yet been updated"
}

How part of latest.json looks like

"created_at":"2020-03-23 17:32:48"

How do I change this to keep looping until the date pull from latest.json matches then proceed to next step (would download and install software). Also, since "created at" has "17:32:48" will this cause the date check to fail since the time does not match?

. I want it to keep checking if dates match.

Thank you!

Upvotes: 0

Views: 1284

Answers (2)

Lee_Dailey
Lee_Dailey

Reputation: 7479

if you want to compare the date and/or time, use datetime objects instead of datetime strings. something like this ...

if you want to test for the actual time difference between two time objects ...

((Get-Date -Date '2020-03-23 18:11:22') - [datetime]'2020-03-23 17:32:48').TotalHours
# result = 0.642777777777778

you keep mentioning date as if you don't want the time, so this method would work for comparing the date parts of two timestamps ...

# the date at the time the code was run = 2020 April 03, Friday 4:30:34 PM
$Today = (Get-Date).Date
$Created_At = '2020-04-03 15:15:15'

$Today -eq ([datetime]$Created_At).Date

result = True

Upvotes: 0

shadow2020
shadow2020

Reputation: 1351

Right now, I'm not going to bother converting dates to match to make sure they're the same format, but what you need for your specific questions is just a do until loop. I might update this to check the date formats if you supply an example layout of the returned JSON.

Do{
    $websiteJson = Invoke-WebRequest "https://website/latest.json" | ConvertFrom-Json  | select created_at
    $todaysDate = Get-Date -Format "yyyy-MM-dd HH:mm" 

    if($websitejson.created_at | where {$_.created_at -eq $todaysDate}){
        Write-Output "Today's date matches"

    } else {
        Write-Output "has not yet been updated"
    }

    start-sleep -s 60

}until($websiteJson -eq $todaysDate)

I believe this wont work right off the bat. You'll have to get the JSON date and $todaysDate to be the same format, then you can do this and it will work.

Upvotes: 1

Related Questions