James Brundage | MVP
mrpowershell.com
James Brundage | MVP
@mrpowershell.com
Jack of all Trades, Master of PowerShell.

Prolific Programmer

Microsoft MVP in Azure / PowerShell

https://mrpowershell.com/
https://github.com/StartAutomating
https://github.com/PowerShellWeb

NB, Neurodivergent, Nerdy, Newsjunkie.

Ask me anything.
A bit of general context:

For a _long_ time, I've been metaprogramming UI via #PowerShell parameters:

Basically: if I can enumerate your input I can build you a UI.

Might be fun / interesting to make this work with #Discord.

Open a lot of doors to a lot of people.
November 12, 2025 at 6:25 AM
Cool. Let's start off with dumb assumption checking on things.

Done a fair amount of #WebDev but haven't done #discord yet...

discord.com/developers/d...

Got an #OpenAPI?

Basically, looks like I send some JSON messages to an endpoint. This a webhook? Please give me the 101 for using this.
Using Message Components - Documentation - Discord
Learn how to send interactive message components.
discord.com
November 12, 2025 at 6:22 AM
Reposted by James Brundage | MVP
So what does the assessment do?

It's a PowerShell module that performs an INTENSIVE analysis of your tenant and provides guidance on how to remediate and secure your tenant.
November 12, 2025 at 1:28 AM
I thought I was one of the only ones who vaguely remembered that language....
November 12, 2025 at 12:32 AM
Any thoughts on what to avoid in brand names?

What part are they saying you can't use? PowerShell? Visual Studio 2013? Tools? 🤔
November 12, 2025 at 12:17 AM
James to James, if you want this, please help build it.

I've been working these angles for a while and everything needs help to get over the finish line and out into the community.

🙏 help build some cool #PowerShell #WebDev projects 😉
November 11, 2025 at 11:40 PM
💯 interesting thoughts.

Been working at this for a while.

1000 foot "here's how"

1. PowerShell has an object pipeline, events, and thread jobs; use them.
2. Everything fast goes thru HTTP / WebSockets on randomized loopback ports.
3. Everything else goes thru .NET api or CLI parsing.

80% there
November 11, 2025 at 11:37 PM
Me too!

As someone who has been doing #Terminal dev and #WebDev with #PowerShell for a long time, I think we should talk.

A bunch of stuff coming down my pike hits a bunch of points in your essay.
November 11, 2025 at 11:09 PM
Efficiency, typing, and potential for coolness.

Array subexpression will turn everything into an array without assigning an intermediate variable

Subexpressions can have conditions and loops within them.

So very slightly faster but way more flexible.
November 11, 2025 at 6:40 PM
Hopefully the good kind of nutty....

#PowerShell #WebDev is a thing

Which vaguely reminds me....

May I pick your brain on Discord UI newness, so as to figure out how to integrate it into some #PowerShell ?
November 11, 2025 at 6:38 PM
I don't see it going anywhere.

The timeline on languages is _long_.

Basic "dying" took somewhere between the 1980s and now.

PowerShell came out in 2006.

I'd say we have at least 40 years.

Also realizing with some horror:

#PowerShell will outlive me

Our languages will outlive us

😱
a painting of a man screaming with the words sherlockspeare tumblr underneath it
Alt: Languages last a long time. Basic was only just now deprecated, after four decades as part of the operating system. C is still going strong. It's creator, Dennis Ritchie, died in 2011. PowerShell came out in 2006, and turns 19 this week. ( they grow up so fast ) Our languages will outlive us. They outshine us. It's beautiful and it's crazy, and it humbles the mind and ego.
media.tenor.com
November 11, 2025 at 6:42 AM
Just wrap it in a list expression @($table.keys).

List expressions are very useful for when you want to force things to be an array.
a man wearing glasses and a bow tie has the words incredibly useful on his face
Alt: List array operators in PowerShell are incredibly useful. By the way, I highly recommend this subject of this gif: The History Guy on YouTube.
media.tenor.com
November 11, 2025 at 6:17 AM
Strangely / sadly no.

Basically keys is a enumerable, not indexable.

Because .keys could change at any time.

To work around this, force into an array.

@($table.keys)[0]

You might also enjoy using this range indexing #PowerShell #Trick:

$table[$table.Keys -match 'pattern']

Hope this helps!
November 11, 2025 at 1:55 AM
💯

Bonus points for #PowerShell #requires :

You can easily detect this with the AST and auto-install the module in a #GitHub #Workflow.

~~~PowerShell
(Get-Command ./SomeScript.ps1).ScriptBlock.Ast.ScriptRequirements
~~~
November 10, 2025 at 9:16 PM
Because of the #PowerShell or because of the #MacOS?
November 10, 2025 at 7:48 PM
Honestly haven't cracked open a Publisher file in some time.

A brief bit of recon reveals it is not a zip file in a trenchcoat 🤔

I don't know of any API off the top of my head, but there _might_ be a COM api.

Looking forward to seeing what you produce.

Glad I don't use publisher 😉
November 9, 2025 at 8:45 PM