Day one of PowerShell + DevOps Summit 2023 is here! This is my favorite time of the year as I get to be plugged into the PowerShell community and see the awesome things that everyone has been doing. This year, the conference started off by giving a well-deserved shout-out to those who helped run this thing.
Kevin Marquette and Missy Januszko: These two were tasked with digging through the presentation submissions and selecting the best presentations for the Summit. As a testament to their quality control, every talk of mine was rejected, which was obviously the right call.
Jon Junell: He has directed everything hotel related, from the food menu down to the number of chairs per table. He’s easy to spot at the convention because he’s clearly rushing off to solve to the latest issue (that we won’t even hear about because he handles it before it becomes a problem).
Harjit Dhaliwal: Harjit handles all things social media and photography. He’s so good at this that he even discovered my good side, which most experts believed to be a myth until now.
These titans of PowerShell put in some serious effort to make this event what it is and deserve all the praise I’m capable of giving. Now, onto the sessions!
Speaker: Brendan Burns
The keynote rocked. Brendan touched on how IT has changed in his time and offered a glimpse of where it may be headed. One quote that really stuck with me was, “Open Source is not selfless, but it is an act of generosity.” That phrase condensed a common thing I hear in interviews: most people start sharing their knowledge to build up a kind of personal repository of their learning journey, but when you do that, you also begin adding value to others. I like it — document knowledge for your own benefit, and then use it to continue benefitting all.
Brendan highlighted that as systems administrators, we’ve all had to be on call and deal with issues in the middle of the night. He emphasized that PowerShell and Automation are powerful tools that can help recover that valuable time.
The last thing he touched on was ecosystem convergence, where the separation of IT roles may be slowly fading as the reach of new technologies begins to touch across all realms of IT. With that, the need to be a bit of a technology polyglot will be more valuable than ever. IT is not a single-language world.
State of the Shell
Speakers: Steve Lee, Jason Helmick, Sydney Smith, Steven Bucher
It’s always fun to see what’s new and coming down the pipeline with PowerShell. The PowerShell team highlighted many new features, including one that is not released yet. The overall theme was PowerShell is a glue to bond technologies together — first within a Microsoft environment, then with PowerShell 7 cross-platform, and then the next phase as technology grows: AI. With all that change and growth, PowerShell has had 27 releases this last year. One of the many changes that can help you track what has been added is the command
Get-WhatsNew, which will help you see what improvements have gone into each build.
Diving into some highlights, they featured improvements in
PSReadLine, including the inline help and predictive IntelliSense. These improvements can help you track down the correct command without leaving your workspace, which is awesome for efficiency.
Crescendo is a fantastic way to take native commands like “IPConfig” and make a PowerShell cmdlet out of it, allowing you to return objects instead of just strings.
A new variable called
$errorview allows you to have a condensed version of errors instead of the wall of text.
$psnativecommanduseerroractionpreference is a variable that will force native commands to respect your error preference. This variable is a huge value add that can help cut back tracking down an error when your script keeps running after a native command fail.
The last highlight is not released yet, but it is extremely cool. PowerShell 7 will soon be able to take results from a native command and pipe them into a second. Typically if you run a curl in PowerShell, you would get a string result but not be able to do anything with it. Now you’ll be able to pipe that into another command like tar and interact with the results of these commands. This new feature can save you so much time by first trying to convert your output and then adding it to a command. I look forward to testing this more when it is fully released.
Testing in Production
Speaker: Talia Nassi
Testing in production was a lot scarier to me before Talia broke it down. My first thought of “go live and fix what pops up” is still that it’s a terrible idea; however, when you deploy production code with feature flags, you can give QA and Dev access to new code that is on your actual environment. This idea makes a lot of sense because if we are going to be honest with ourselves, no staging environment is the same as prod. A staging environment can’t possibly catch all errors. At that point, it’s mostly a sunk cost. Looking back at recent Windows releases, Microsoft has been doing this for some time. That’s why the enablement packages are so small and seem to do so much. They are not updating the software but flipping the feature flags to enable code that is already there.
Another advantage of testing in production is that response times will be quicker for fixes, as errors in staging are easier to ignore. No more configuration drift, as the incremental changes made in staging don’t always match what is pushed to prod.
The last major component of making this change for your testing is instituting a canary. Don’t release to 100% of your base. Release it to a small subset first and see the response. It’s better to potentially upset 1% of your customer base versus 100%. By using the guidelines covered here, testing in prod does not just seem feasible, it becomes downright reasonable.
Exploring and Building Cross-Platform TUIs
Speaker: Andrew Pla
This one opened to thunderous applause, drowning out all other talks for a solid 30 seconds.
A TUI is a terminal or text-based user interface. I was surprised going into this talk how little information is available on it. At its core, it’s a lightweight, fast, and efficient interface that can have less context switching. If you ever piped your results into
Out-Gridview and lost all momentum as you go into a new window and leave your workspace, TUI’s may be for you. Using the module Microsoft.PowerShell.ConsoleGuiTools will give you access to an alternate command
Out-ConsoleGridview, which will put your output into a terminal window instead, ensuring you can stay in your workspace (which is always nice). Andrew also showed off the project Terminal.GUI, which can be used to make cross-platform TUIs and has a ton of features. Great talk — Andrew is the best!
Speaker: Steven Bucher
This presentation was an excellent opportunity to hear from one of the members of the PowerShell team as they highlighted all the ways they are looking to add helpful changes. Steven first featured the recent changes to
PSReadLine. With the predictive IntelliSense, you can pull recommendations from not only your history but also provider plugins in PowerShell 7.2+, which can significantly reduce the time it takes to get the correct command. If you’re working in Azure, the az.tools.predictor is almost mandatory.
Steven then talked about Feedback Providers, and I cannot wait to see everywhere they take this one. Feedback Providers can respond based on specific errors to reduce the time you take to troubleshoot your code. One example he highlighted was misspelling a command, and the Feedback Provider put the command he might have meant right below the error. Some future possibilities as this grows are to give you the command you need to import a module if you try a command from a module you do not currently have installed. The potential to help eliminate wasted time is enormous, and I will keep my eyes open for future updates in the PowerShell community call.
If you want to learn more about Feedback Providers, you can see if it is available with the command
Day one wrap up
That wraps up day one of the PowerShell + DevOps Summit 2023. I am excited to see where PowerShell goes with some of the upcoming features I got to see today. PowerShell continues to grow and keeps the promise made years ago: “Learn PowerShell and we’ll do everything we can to make it the best investment you’ve ever made.”
Sustainable, Maintainable, and Durable. Azure Durable Functions in PowerShell
Speaker: Jaap Brasser
I will be honest — I have never dealt with Azure functions, so I was not fully clear on what a durable function even was. Diving into the deep end was a fun way to start the day, and Jaap always delivers a great talk.
Durable functions allow you to write stateful functions in a serverless environment. This is extremely valuable as it allows you to maintain information between your functions. It allows you the ability to have state checks on your code, restart failed tasks, and inject checkpoint for long chains of functions. The ability to recover if a script errors or maintain the data passed through if you need a restart is a massive step towards idempotency of your workflows.
There are more workflows possible with this than I can cover in a quick recap, but if you want to learn more, the documentation for durable functions is great.
ugit: git, PowerShell, and the object pipeline
There is a lot to love for Git. Who does not love quality source control? One issue that James pointed out is running it in PowerShell does not return an object. Ugit is a module that allows you to return objects. This is a common practice with things like Crescendo to wrap an EXE in PowerShell, giving you a module built for PowerShell.
James instead created this module using something called command interception. PowerShell loads commands in the following order.
External executable files
This means if you attempt a git clone, it tries every method and finally finds it in the fourth option. So if you create an alias or function of the same name, it would load your code first and never get to option four making sure your code is what runs. This was a different method than I am used to with modules, but it was interesting to see the process in action.
A year of improvements to your PowerShell editing experience
Speaker: Sydney Smith, Andy Schwartzmeyer
This session was talking about improvements made to the PowerShell extension in VS Code. Many of the changes we have had are under the hood, while we benefit from faster and more stable processes or make new releases easier. Rewriting the pipeline execution with cancelable and ordered tasks is probably the biggest performance enhancement in the last year. Expanded regression testing helps ensure safer future releases.
Changes that may be more noticeable:
Significant improvements to IntelliSense make getting the correct command easier and quicker.
Built-in code snippets have been revamped.
The debugger has been reworked to be more stable and able to expand variables.
PowerShell extension in vscode is in great shape, with more improvements still to come.
WinGet PowerShell Modules
Speaker: Demitrius Nelon
I was really excited about this talk. Winget was something I thought had a lot of potential, but it never worked great in PowerShell. The module just released in alpha on April 24, so what we got to see is just a starting point, but I think it’s promising. Demetrius was very open to feedback, and I think involving the community means this is going to be a solid tool for PowerShell for a long time.
Day 2 wrap up
Day two is in the books, and it did not disappoint — amazing sessions, a lot of learning, and it ended with some fantastic conversations. After a few years, people have adapted to the post-COVID PowerShell + DevOps Global Summit, and it seems like it has begun a full recovery. It feels good to see it at its best.
Code Golf: The zen of writing bad code II
Speaker: Kevin Marquette
This talk is back by popular demand, and I was excited to be able to attend this year. The overall idea of code golf is to complete a given task with as few characters as possible. While at first glance this seems like it might just reinforce some bad habits, it actually provides a unique way to learn. To condense code enough to make it on any leaderboard, you are going to have to really understand how things work under the hood. You learn things about how common functions work that you might not have realized before. Just please — nothing from this goes into your production code.
Improving Shell usability - Crescendo
Speaker: Jason Helmick, Jim Truher
Crescendo is an awesome module that can help you wrap your native commands in PowerShell, changing native command line from returning a string to an object. Instead of getting a large string with ipconfig, you can use Crescendo to return an object with Get-IPConfig and limit the returned properties.
Some fabulous changes have been made with the most recent build. You are now able to bypass the output handler when building your module. This allows you to make sure you can get the correct data when the output is not working for you. They have also added argument transformation, allowing you to modify results. For example, net use has separate sections for usernames and passwords. You can capture a credential object and, in the transform, split the username and password. It is a nice addition that makes getting all the information you need just a little bit easier.
Tempting Fate: Patterns & practices for shareable scripts and functions
Speaker: Joel Bennett
This was a great talk about best practices for creating modules. Joel had three rules for his code to be sharable:
I can’t embarrass you.
Others need to be able to figure out your commands.
Needs to work together with other modules.
Rule one has a few requirements. It needs to have error handling, you need to log everything, and it needs good documentation. The last great bit of advice is to make sure your output is the object type you want. If you are returning a hashtable, have your script convert it to a PSCustomObject. The correct object type makes sure users get the results they are used to.
Day three wrap Up
The third day is done, and it was awesome. I am not sure if I am attending different sessions than my usual, but this year it feels like I have been able to sit in and learn about either new releases or prerelease updates to PowerShell. I am excited about the changes I have seen coming. Can’t wait to see what the last day of the PowerShell + DevOps Global Summit has in store!
Amazing feats of the Abstract Syntax Tree
Attacking a complex topic first thing on the last day of the summit was a bold choice. Abstract Syntax Tree (AST) is the bedrock for expanding PowerShell. It represents the syntactic structure of text (which I am still attempting to fully comprehend). Almost all other languages have the AST hidden, but PowerShell flies it out in the open. It allows for a unique opportunity to make significant changes to customize PowerShell in ways you would not expect.
James showcased several examples, but two stood out the most to me. First, he managed to make PowerShell run 48 other languages within the shell. As a one-language guy, I am probably not the best test case for this feature, though I thought it was still a significant addition.
The second example was making PowerShell accept sentences as commands. He sent the sentence, “All functions that quack are ducks.” When he ran it, it took functions that contained the word quack and gave it the PSTypeName of duck. While the example is a bit silly, it shows something pretty amazing.
While I didn’t understand everything, it feels like AST is the next thing I need to learn to up my PowerShell game. I’m really glad I made it to this talk.
AI generated code at your service
Speaker: Pierre Roman
This talk covered a lot of what’s new with AI. It showcased GitHub Copilot, which uses the codex model from open AI. So instead of being chat based, it’s code based. Being code based comes with many advantages, but Copilot learns based on code in open source GitHub, which may not always be the best code. While the tool is very powerful, it can’t help you track down a certain command without moving out of your console. And not breaking your focus is immensely valuable.
AI is here to stay, and it will only grow in importance. While it won’t replace you, someone who knows how to use it effectively might. It’s quickly becoming mandatory to be able to present the correct query in AI.x
Talking community to the OnRamp
Speaker: Me, Andrew Pla, Mike Kanakos
This is my first ever talk at PowerShell Summit, and I had a blast. We spoke to the OnRamp crowd about ways they can join the community that we all love. Kanakos made a great point that even telling someone that you appreciate their blog or presentation is one way to join in.
As for PowerShell itself, it can feel daunting. Where do you even start when first jumping into PowerShell? But luckily, not everyone needs to follow the same path to contribute. Often, just taking small steps into PowerShell is all you need to do. As you put in the effort, more options will open up to you. And with the PowerShell community, it’s easy to jump in because everyone is so welcoming.
Day four wrap up
The DevOps Global Summit 2023 is in the books, and I have never had a more fulfilling time. I tried my best to participate in every event and socialize with as many people as possible. As an introvert, it is absolutely exhausting. But it has been one of the most rewarding experiences of my life by far. I spend a LOT of time talking up this convention, but even as one of its biggest supporters, I am still blown away every year by how great it is. I hope any fan of PowerShell gets a chance to attend at some point.
Jordan had spent his life wondering why tasks he didn’t like to do had no options to complete themselves. Eventually he had to make that happen on his own. It turned out that he enjoyed making tasks complete themselves, and PDQ thought that is something he should talk about on the internet while drinking most Thursdays on the PDQ webcast.