# More Power to you: About equality in PowerShell and finding next Monday in Power Automate

Just two quick lessons I learned in the last few weeks:

## Lesson 1: Equal isn’t equal in PowerShell when it comes to environment variables

This was an issue a colleague and I struggled with a while back when we couldn’t figure out why a certain piece of conditional code wasn’t running as we expected. The answer in the end was that a `$null`

equality check behaves differently between normal variables and environment variables. First consider this, which is what at least for me is the expected behavior:

1
2
3

PWSH C:\Users\tfenster> $test = ""
PWSH C:\Users\tfenster> $null -eq $test
False

But if we now do the same thing with an env variable, the behavior is different:

1
2
3

PWSH C:\Users\tfenster> $env:test = ""
PWSH C:\Users\tfenster> $null -eq $env:test
True

Of course, this also means that `if ($null -eq $test) ...`

behaves differently than `if ($null -eq $env:test)`

. Probably a lot of readers will say “dude, that’s obvious”, but it wasn’t for me, and it took us a while to figure it out, so I wanted to share it.

## Lesson 2: Finding next Monday is not that hard (or ugly)

On the second topic, I had to figure out how to get to “next Monday” (and “next Friday”, but that is obvious when you have next Monday) in a Power Automate flow. As explained here, I typically schedule the tasks of a week in advance, somewhere between Friday afternoon and Sunday evening. For this, I have a Power Automate flow that looks at my Planner and To-Do tasks for the next week and puts them in a calendar dedicated for tasks. I could do this by just manually setting “next Monday” as the start and “next Friday” as the end, but I really have a very low frustration tolerance for repetitive tasks, so I wanted it to be fully automated. But that meant I had to figure out how to get “next Monday” in a Power Automate flow. A little online searching led me to solutions like the following (source):

1

if(equals(dayOfWeek(utcNow()),1),addDays(utcNow(),7),if(equals(dayOfWeek(utcNow()),2),addDays(utcNow(),6),if(equals(dayOfWeek(utcNow()),3),addDays(utcNow(),5),if(equals(dayOfWeek(utcNow()),4),addDays(utcNow(),4),if(equals(dayOfWeek(utcNow()),5),addDays(utcNow(),3),if(equals(dayOfWeek(utcNow()),6),addDays(utcNow(),2),if(equals(dayOfWeek(utcNow()),0),addDays(utcNow(),1),null)))))))

I’m usually fine with pragmatic solutions to development problems, but this really didn’t seem acceptable, so I started thinking about it for a bit. What is the problem? We have the `addDays`

function as documented here to add days to a date, `dayOfWeek`

as documented here to get the current day of the week, `utcNow`

as documented here to get the current date and `sub`

as documented here to subtract two values. Theoretically, this is easy: On Monday, we need to add 7, on Tuesday we need to add 6 and so on until Sunday, where we need to add 1. Unfortunately, `dayOfWeek`

returns 0 to 6 for Sunday to Saturday, not 0 to 6 for Monday to Sunday like other languages. If the latter were true, I could just do something like `addDays(utcNow(), sub(7,dayOfWeek(utcNow())))`

which first subtracts the number of the current day of the week from 7 and adds that to the current date. For most days, we could do something similar, because we need something that translates 1 (Monday) to 7, 2 (Tuesday) to 6 and so on until we get to 6 (Saturday) to 2. This is also easy, `addDays(utcNow(), sub(8, dayOfWeek(utcNow())))`

. Works fine, but Sunday = 0 needs to be translated to 1, which doesn’t work here.

Fortunately, we have another helper, the `mod`

function as documented here. It returns the remainder of the division of two numbers, so `mod(6,7)`

returns 7 while `mod(7,7)`

returns 0. This means that if we do `mod(sub(7,dayOfWeek(utcNow())),7)`

, we get e.g. on Monday `mod(sub(7,1),7)`

, which is `mod(6,7)`

= 6. On Sunday, we have `mod(sub(7,0),7)`

, which is `mod(7,7)`

, which is 0. Remember, we needed Monday to translate to 7 all the way to Sunday to translate to 1. Now we have something to translate Monday to 6 all the way to translating Sunday to 0. This is an easy fix, we just need to add 1, so we end up with this beauty

1

add(mod(sub(7,dayOfWeek(utcNow())),7),1)

Maybe not exactly easier to understand than the endless if-else thing above, but I like it a lot more :)

Webmentions:

No webmentions were found.

No likes were found.

No reposts were found.