 Hello, folks. Welcome to Ops 117. I am here with Joey Aiello and Jason Helmick. I pronounced that right. Did I? Yeah, you got it. All right. Yeah, you got it. All right. So today, we're going to discuss PowerShell. Most likely PowerShell 7, maybe a little bit of the original PowerShell Windows PowerShell. But for that, I'm going to give it to Joey. So Joey, exactly what are we going to talk about today and how deep are we going to get? Thank you so much, Pierre. Today, we're going to be talking about primarily PowerShell 7. What is it? How do you get it? What's it for? How to learn PowerShell with PowerShell. So we're really starting for those folks that are not super experienced with PowerShell. It might be your first time. You may not even know what PowerShell brings to the table. But then we're going to be going through some new stuff, primarily some new modules that we're putting out that work great with PowerShell 7. They're going to make your life a lot easier, especially if you are already an existing PowerShell user. So there's going to be plenty of new fancy stuff for those of you embedded in the community and on the cutting edge of PowerShell. That's perfect. So get into school. Let's get right into it. Yeah, so why PowerShell? What is PowerShell in the first place? And if I'm not using PowerShell today, what's it really for? So PowerShell is a framework in the language that's designed primarily for IT pros to manage their on-premise infrastructure, their cloud infrastructure. It's also very well suited for DevOps scenarios. Those of you with continuous integration and continuous deployment pipelines, anyone doing any sort of automated application testing as well as development workflows. So even as a local tool on your DevBox or as an IT pro, it's something that just, for Power users makes life a lot easier in terms of managing things on your file system, managing your personal machine, et cetera. So PowerShell really spans the gamut of all these scenarios and really if you're someone who likes to avoid doing manual tasks repetitively, PowerShell is probably for you. So one of the primary things that differentiates PowerShell between other shells like it, something like Bash or CMD is that PowerShell deals primarily in objects. So instead of emitting text as its form of output while you do see text on the screen, you get these nice fancy objects that have properties on them, they have methods, they allow you to sort and search by fields rather than using really fancy regular expressions or AUK or SED or grep as parsing tools to sort of work through the text-based output that you would typically get on a Bash or CMD style shell. So similarly, we've got this verb noun pattern that makes command lists very discoverable, right? So PowerShell is sort of this tool where you can kind of feel around and get an idea of how things work even if you're not reading the documentation and even if you've never used a tool before. So you've got this very consistent, get command, get network adapter is very verbose and a way to really describe what you're doing in sort of plain English, right? So PowerShell scripts are very readable for those of you that maybe are first-time programmers, first-time writing any kind of script and you just wanna sort of read this thing from top to bottom, it's gonna make reasonable sense what that script does even if you're not necessarily a PowerShell guru. And then finally, you have an extremely wide set of modules available for different specific tasks. So we've got the PowerShell gallery where over 8,000 modules are hosted. These are used for managing all sorts of different systems across different operating systems, clouds, on-premise environments. And then if that's not enough, you've got all of .NET available for use to fall back to, which is an extremely large, stable, robust performance set of APIs that are typically used in C-Sharp or F-Sharp but can also be leveraged from within PowerShell. That's perfect, okay, sounds good. So for those of you that do know a little bit about PowerShell, maybe you've been using that good old blue shell window inside of Windows for the last 10 years. You were a big fan of Monad and you've tracked with PowerShell this whole time. So what's going on with this other PowerShell and why are there two PowerShells? Well, the traditional PowerShell that you're used to, we know as Windows PowerShell, right? So this is the one that's built into the operating system. It's built on the traditional .NET framework today that's something like 4.8.x. And it's right there available to you as PowerShell.exe inside of a Windows or Windows server machine. Given that, it works very well with these sort of traditional or legacy modules, many of which are still built into Windows, many of which may have been developed years ago, shipped with various on-premise products. And really, this is a PowerShell where we specifically want to keep it very stable, right? And the idea here is for all those workloads you have, just like you're still probably have a couple batch scripts hanging around inside of your environment that you've got to run inside a CMD, you're probably going to have scripts that into the foreseeable future will need Windows PowerShell and or the .NET framework to continue working, right? And given that, we really want to park it in a maintenance mode, right? So it's still good security updates. You can still trust it as an inbox application. Works great for all those workloads, but it's not going to be getting any new features. And this is really something where we're trying to keep it as is so that all of these existing workloads continue to work as they have for the last however many years. Similarly, Windows PowerShell is built around WinRM-based remoting. And so for those of you that have used EnterPS Session and use that with WinRM, that is the really the only remoting protocol available there on Windows PowerShell. Fast forward to PowerShell Core and PowerShell 7, as we now know it, PowerShell Core 6 was around for a little while, now out of support, been completely superseded by PowerShell 7, which is awesome because PowerShell 7 works on Windows, macOS, and Linux. It's fully side-by-side with Windows PowerShell and actually with other versions of PowerShell 7 if you'd like to have a couple different versions on your machine for testing. We've got Docker containers. It's in the Ubuntu Snap Store. We've put it in as many places as possible to make it as easy as possible to pick up so that when you're ready to make that leap to Windows PowerShell, not only can you find it anywhere, but it's also you're gonna be able to take baby steps in terms of testing PowerShell 7 out in smaller quantities with newer workloads, right? And so this is built around .NET Core or .NET 5 plus as it's now known, it's gonna continue to 6, 7, 8, 9, 10, highly compatible with modern modules. So any of new modules that Microsoft is producing are compatible with PowerShell 7, but we've also got this awesome backwards compatibility layer on Windows that allows it to call into Windows PowerShell for those modules that are not available. So thank you, quick question. So if we've written PowerShell in our audience, everybody's watching right now who's been working in any environments for a number of years. And we've got this legacy of PowerShell scripts that we're using for login scripts, for a setting up server, for deploying workstations, for managing environments. Like does that, like if I've got these old scripts, can I just run them on PowerShell 7? You shouldn't be able to run them on PowerShell 7. I will say that there are a couple caveats, there's a couple gotchas from a compatibility perspective, but generally speaking, especially if you're still using those on Windows and you still have access to Windows PowerShell, PowerShell 7 is going to intelligently call out to Windows PowerShell under the hood without, you know, very invisibly for those commandlets that may still be incompatible with PowerShell 7. So we've bridged the gap here in such a way that for you, you can just use PowerShell 7 as that entry point for all automation. And then Windows PowerShell is sort of leveraged as this sort of backend compatibility component when necessary. But we're steadily increasing the number of commandlets that are natively supported in PowerShell 7 so that this is unnecessary. We're at about 70% of all the modules in Windows are fully compatible. And we've got a link here at the end of the presentation for you to find out more information on which modules those are. But the side-by-side nature of PowerShell 7 means that you can go and test one script at a time, take those baby steps, make sure that nothing's gonna break and, you know, you don't have to impact your existing Windows PowerShell workloads or make a switch over all at one time. Oh, okay, that's perfect. You know, Peter, the one thing that we're going out that Joey started with on here is something to keep in mind if you're really comfortable with Windows PowerShell and you're used to opening up the console and launching PowerShell, you've been typing PowerShell.exe when you bring down PowerShell 7 so that we get that side-by-side capability, the executable's different. So if you type PowerShell, you're not gonna get what you think. What you really wanna type is PWSH. And that's the .exe that we're using now and that's what gives us side-by-side. I've actually gotten caught doing that a bunch of times already. So I learned that actually now I've just got shortcuts everywhere, but that's beside the point. Yeah, and we have differentiated the icon as well for those of you that have a bunch of taskbar shortcuts. So we've actually got a black icon now. The background by default is black. And then we additionally, we even ship a PowerShell 7 preview that's got our fancy mascot that you saw here on the last slide as the parallelogram icon so that you can add a glance and know whether you're using the preview versus the stable version. So yeah, fill up that taskbar and use all those fancy icons. So obviously there's a ton of new features in PowerShell 7 and there's really too many for me in the list here, but we've got integrated parallelism, loads of new command lists, all kinds of new language features and operators, SSH based promoting, obviously the ability to deploy on Docker or across all these other operating systems is huge and there's just so much more. So you'll wanna check out the PowerShell 6 and 7 release notes for a more comprehensive list of these things. Oh, a big one are web command lists and JSON command lists are massively improved to be more compatible with all the world's REST APIs. So there's just, there's a ton of stuff in there and I urge you, if you're doing any kind of modern IT or DevOps development, you should absolutely check out PowerShell 7 to avoid a lot of the kind of snags that folks have run into over the years with Windows PowerShell. Perfect. So moving along, we're just gonna hop right into how to learn PowerShell with PowerShell. So again, this is for those of you that may just beginning your PowerShell journey and we're just gonna go ahead and hop in to a terminal right here. So the first thing that we wanna do is make sure that my notes are available to me because while I have done this a thousand times, I always, when presenting, we'll miss a little bit here. So one of the first things to note about PowerShell is that there is a lot of information, right? So something like command, right? I can just use tab at the end of this and that's gonna just complete my command. If there are multiple options that continue having a tab, that's gonna continue rotating through more and more of these. So if I go ahead and run get command, you'll see this verb-down pattern everywhere. There's a million functions on my machine. So the question is how do I really parse these down? I'm trying to accomplish a specific task. What's the best way to do that, right? So I'm gonna use that command and then some wild cards to get a little bit closer in terms of what it is I'm specifically looking for. So let's say I know I want something to do with Azure and I know I want something to do with Azure networking, right? So I'm just gonna go ahead and say get command, star, AZ, star, met star. And that just means any characters in between where those wild cards are, show me everything that matches that. So you'll see, I have a bunch of these, AZ virtual and metworth, right? And so, okay, great. Let's say I wanna create a new AZ network interface. All right, so I'm just gonna go ahead and copy that command or even better, I'll use tab command. Or not, let's say a new AZ virtual map, this is great. Not this command, get help, right? And so, get help, again, this is learning PowerShell with PowerShell. I can pass this command, I'm able to get help. And I'm actually going to get some very interesting documentation. This is gonna be a summary of the documentation. Sometimes this takes just a second for the help system to do some caching. But you'll see, I've got these parameters available to me the types that those parameters want to accept. We've got a description. Obviously, the new AZ virtual network command creates an Azure virtual network, I would hope so. But it says, hey, if you want the full help, you're gonna wanna type, get help, new AZ virtual network dash full. So I'm gonna go ahead and hit up on my command line to see the previous command that I just typed and I'm gonna put in that dash full. And you'll see I get a much longer set of documentation, right? So this actually includes examples throughout. We've got inputs, parameter descriptions, key value pairs in the form of a hash table. For example, here's how you would use dash tag, right? So all this information's in here. But maybe I don't want it in my terminal. Maybe it'd be nice if I actually could pop up a window here locally. Unfortunately, this one only works on Windows due to some limitations with how graphical interfaces work on partial seven. But you'll see I got a little window pop up here. It's now searchable, all the same exact information available inside of a little window pop up. But regardless of what operating system you're on, you can also use, I'm gonna make sure this is the browser that this is gonna pop up in and we're gonna see all this goodness in a minute here. But if I use dash online instead of show window, I'm going to see documentation available right there on the web. So this is always gonna be the most up to date version. I've got fancy formatting here. I can even use cloud shelf automatically try this from this documentation. So this information is everywhere, highly discoverable, really a great way to, again, sort of explore what's available to you within PowerShell modules from PowerShell. So similarly, I want to see all of the modules available on a machine. The module is a lucid section of, unless I'm gonna go ahead and type module-list available, and that's gonna show me all of the available modules that are installed on my machine. And this takes a second sometimes due to caching, it's cheaper, all subsequent runs within this session. This is gonna show me and it also takes longer the more modules you have installed on your machine. And I have a lot of modules. Well, I assume you've got them all or pretty close to that. Yeah, not quite all the 8,000, but I am a little surprised here. I see this taking so long. I expect I might have something to do with the screen sharing as well. So you'll see all these Azure modules, right? These are in different locations, but these are the ones that are built into Windows. You'll see, these are actually all of the built-in Windows PowerShell modules that are compatible with Core. So this PS edition says that these are all managed by DNS client, right? Then adapter, right? And all that natively works on Herschel 7. So a ton of modules available to me and then I can, you know, if I wanna see something for a specific module, it's a get-commanded-manage-module adapter. And great, I've got, you know, this set of commandlets associated with that. Herschel's not case-sensitive, so you can see I take the case wrong. Doesn't matter. A lot of these tabs complete really great. The last thing I'm gonna show just really quick is the ability to find modules on the PowerShell Gallery. So if I switch it over here, you'll see, you know, we've got PowerShellGallery.com again, has over 8,000 modules. Maybe I want a module for managing YAML. This is very popular and there are a number of these. You know, so I've had it similarly searched just like I did in get-module, I can use find-module and that's gonna go to the gallery, it's gonna ask it, hey, are there any modules that have this YAML keyword inside the title? This may take a moment because of my lovely network access, but I assure you that this is gonna return the same set of results that we just saw there on the web and then I can subsequently use the install-module to install something like PowerShell-YAML. So I can actually take this instead of, you know, install-module, we'll go with this one since it's above one, I don't actually know if that means it's any good, but I'm sure it's great. So you'll see, this means it brings it into my own space that I've got a module there now. You know, we do our best to make sure that there's nothing malicious in the PowerShell gallery, but if you're playing in the production, as always, big disclaimer, make sure you do inspect the module itself and make sure that it does do what you think it does before using it in a production environment. And that you trust the source. Yes, you trust the source. I mean, most of these are open source because a lot of them are written in PowerShell script, so trusting the source may be, you know, simply reading the source yourself, but yes, if you trust the author and the person who published it, you know, then you may choose to forgo that manual code inspection. So lastly, I just want to show, you know, PowerShell 7, this is where it lives here on github.com slash PowerShell slash PowerShell. There's a ton of good information here about the differences between Windows PowerShell and PowerShell Core or 7. All the different platforms you can see that we're available on, you know, where the preview releases are available, binary archives for all these things, our community dashboard, so much more. If you're having any issues in PowerShell 7, you should hop over here, file an issue, let us know. We also take code contributions in the form of pull requests and we've got a ton of community members who are just amazing in terms of submitting all that. And then finally, this page is akafs slash install PowerShell. This is going to give you all the information based on which operating system and platform distribution you're installing on, how you're going to install PowerShell 7 in the most supported way and what your options are. So definitely give all that a look as you look into moving your workloads to PowerShell 7. That's great. Which back over to our PowerPoint here. Yeah, well, we're really excited. It's been a few years now of PowerShell Core and it's really come into itself as a very viable replacement for Windows PowerShell and something where all of the awesome automation innovation is really happening. That's perfect. Yeah, so I want to hand it over to my accomplice and the partner in crime here, Jason Helmick, who's going to be talking about some new additions that we've been made to tab completion to make PowerShell even more intelligent. So I want to hand it over to you, Jason, go ahead and take it away. Yeah, so Joey was just showing some tab completion, how you could start a command, hit tab and it completes it for you. We do tab completion on parameters to help you out as well. That's great, PowerShell teaching in PowerShell, but Pierre, I have a question for you. I want you to think about something. If what if you could recall and instantly do any skill or anything that you would have ever learned in your life? You had instant memory for everything you've learned and every skill you've done. Would that be worth something to you, Pierre? Absolutely, I'd have Joey's job. Exactly, we'd all get Joey's job. Well, here's the thing, PowerShell is going to continue to help you in a variety of ways. Let me show you my desktop. I'm going to bring up PowerShell and I'm running one of our latest preview versions that we're working towards for 7.2. And I want to show you something that PowerShell can do. PowerShell knows everything you've done. So when you start typing today, we have a new feature called predictive intelligence that you can enable that will remind you of everything that you've already done. So I'm going to try to do a get child item and get a list of things on my file system. So I'm going to start typing get child. And as you can see in the green color, it's already predicting get child item for me, but I'd like to do with it. It's getting this from my history. So if I've done something before, it remembers it and it brings it up on screen. The benefit to this is I can immediately, that's what I wanted. I can accept it and I can execute it. So maybe, and I'm going to clear my screen, maybe I started typing get child item and I'm like, I can't remember all what I did with the pipeline and what I did with sort and select. This reminds you and you can choose the thing from your history that gives you the best representation. Let me show you this. I'm going to say, you know what? I want part of this, but there was something I had done earlier. It wasn't a select. I think I was sorting some information. So I'm going to start to type sort. It will continuously checks your history for when you're typing to see if it can make a match. And in this case, it found the match for a sort. I'm off to the races and executing. Now look, if you've worked with PowerShell, especially Windows PowerShell before, you notice that if you run commands like get history, I think that's the first time I've ever typed that correctly by the way, this history is session based. This is the PowerShell history and these commands used that was based upon your session. So when I close this session, all of this information goes away, but the history that we're using for predictions is from PS Readline. That's one of the modules that allows us to run the predictions. And that history file is all your history across sessions. So as you learn and as you do things correctly, PowerShell is going to remember what you did and then provides you information. But Pierre, you know what? This is where it gets really cool. What I just showed. Oh, it gets cooler? Is that what you're telling me? It even gets cooler. Yeah, it even gets cooler. So as you see what I'm doing here, yeah, I'm doing this on PowerShell 7. Well. And sorry, Jason, what was the short cut on the keyboard you're using to actually complete that at the end when you got to sort? Oh, thank you so much, Joey. So when I want to accept this entire prediction, the stuff you see in green is the prediction. If I just want to accept all this, I'm hitting the right arrow key to accept it. I can use, and by the way, you can redefine these keys to whatever you desire. But right now the keys by default are set up that if I wanted to, let's say I'm starting a prediction and I want to move forward or backward, I can use control F to move forward. I can use control B to move backward so I can make adjustments. I can edit this and find other predictions that may match better for me. Nice. Now, one thing though, I think that just blows people's minds away. This is cool, but wait, it's only cool if I can use it where I need it. I'm on PowerShell 7. I'm actually on a preview for 7.2 right now on Windows. Well, but what if you're somebody that uses, oh, let me grab it here. What if you're somebody that uses Windows PowerShell? Well, here's the thing. And then we're gonna give you some links for this and I'll show you where you can get this from, but take a look. It works on Windows PowerShell 5.1 as well. So if you're using Windows PowerShell and you haven't gone to PowerShell 7, boy, we really wish you would go to PowerShell 7, but this works on Windows 2. Not only does it work on Windows, but hang on a second. I'm gonna flip over to my Mac. I'm gonna bring up my Mac and I'm gonna start typing. You see, I get a prediction on my Mac. So it works cross-platform just like PowerShell 7. That's part of the goodness of PowerShell 7 working cross-platform. Now, this is good, but we've also gone a little bit further because what we wanted to do was modernize and then go to the next gen of shells. So to modernize our shell, this is very similar right now to what you might have seen if you worked with Rust or with ZShell, their suggestions that they give you. So we've modernized to meet that, but we wanted to go a little bit further. One of the problems is as I'm typing, I might wanna see some of the other options that are in my history. So we give you an easy key press. You press F2 and now you get this new display for predictions that we call list view. The other view we refer to as inline, only one line. This is list view and you can, oh, wait a minute, I see that sort that I want. So you can use the down arrow. You can select it. You see the line where my prompt is, is changing to match. I can strike enter, I'm off to the races. That view- That is so much better than up arrow, down arrow for the list of commands that I've been typing in for the last three hours. You know what, Pierre? I told you you were gonna like this. I predict you're gonna like it even more when I get done. So just so that you can see that this also, this extended view, having list view, also works on Windows PowerShell, also works on Linux. All of that is good. Here's what this does for you. If you've done something before successfully, this will accelerate you to getting it done again and refresh your memory. So if an experienced PowerShell user that's accomplished a lot of things, this is a huge accelerator to making your future life a little bit easier and better. But Joey was talking about PowerShell teaching you PowerShell and you have get help to teach you how to use the system and how to use commandlets and how things work. I really liked that premise that PowerShell is trying to help you along the way. So I wanna show you something else. Now this is currently being worked on. So this is work currently in preview that we're working on and I need to make a change. I'm gonna change my, oh, thank you, predictive intelligence. I'm gonna change something called the prediction source, which is right now only using history. I'm gonna change this to use something called history and plugin. And this is where additional folks, whether they're from Microsoft or from outside of Microsoft can write their own predictors. And what I'd like to show you is, is I have a predictor written by one of our internal teams, our friend, as a matter of fact that Joey and I work with Damian Caro over the Azure PowerShell team. I know Damian as well. Yeah, so what he did here is he put together using our prediction engine, he put together an ML-based predictor for Azure PowerShell. Now what this does is I haven't successfully done anything with Azure PowerShell. I'm not even exactly sure what to do. All I know is, is I wanna make a new VM. Well, with that knowledge, if you know a little bit about PowerShell, you know, you can probably type new, then you can probably put in, and the AZ command, let's all begin with AZ. And I wanna make a new VM. You can already see that the predictor for Azure PowerShell is predicting not only the command that I wanna use, but the parameters. And it tells me that I need some arguments for that. But here's the interesting thing. Take a look at the one that I have suggested. I wanna create a new VM. One of the first things I notice is that to create a new VM, sure I can give it a name and all that kind of stuff, but it needs a resource group. Oh, wait a minute. I'm not even sure I really understand what a resource group is, but I'll trust it. So let me back up a little bit. Back up a lot. And let me just see a new AZ. How do I make a resource group right there? Oh, that's what I want. So now I'm on the line. I can make the resource group. It taught me what to do to make the resource group. Then it's teaching me what parameters, what arguments do I need so that I can be successful at making the VM. An interesting thing here. Now I didn't have, I'm not actually connected to Azure right now, so I didn't expect it to work. But here's what I want you to notice. The arguments that are typed in here for the resource group, its name and its location, this kind of stuff. We are gonna reuse that so that later when you wanna create the VM and put it in your resource group, we're gonna auto-populate that argument for you. We're gonna try to help you fill this stuff out as you go so that you have a better experience. So what we're doing with these predictions is we're helping you accelerate where you've already been successful and on new technologies where you might be, I'm not sure how to use this. We're basically giving you the examples on the screen. Examples that have been modified to get you into action sooner. So pretty cool. You wanna know how to get it here? Yes, I do, absolutely. As easy setup question, right? So let me just show you using PowerShell Get fine module. This makes my life a lot easier. I'm gonna switch to my list view here really quick. It's PS ReadLine. Okay. Let me just tell you right now, today if you were gonna grab this, as soon as it comes up and shows me my PS ReadLine, version 2.1 of PS ReadLine has what I've been showing you so far of being able to type in and being able to see the list view. This version also works on Windows PowerShell 5.1 and of course it's cross-platform. If you wanna be able to work with additional plugins, that requires that you be on PowerShell 7 because we had to add some new components to the PowerShell engine that don't exist in Windows PowerShell to manage these plugins. So you gotta be on PowerShell 7, but then you can add the plugins in the version of PS ReadLine that's available to you today is let me just do a loud thank you predictor. Let me bring it up here, 2.2 beta one and this will be moving forward in our future previews as well so that you'll be able to work with the predictors. If I wasn't recording this session, I'd be installing it right now. I do have one question though. So you've mentioned this is a cross-sessions and everything however, myself and I know a lot of our audience are probably in the same boat as well where I go to Azure Shell, I use the Azure Shell a lot. And then on some of my machine I don't even have like PowerShell or add the Azure like CLI or anything installed. I just run the Azure Shell container locally and just kind of. You're talking about Cloud Shell here? Pardon me? You're talking about Cloud Shell here? Yeah, Cloud Shell, sorry. Cloud Shell, yeah, yeah. So I use Cloud Shell so it's got everything built in so I want to install this and that's great. But what if I jump from one machine to another or from one shell? Because when you're in the shell and the container disappears, whatever's in there also disappears. How do you deal with that? Or is that something that's even possible at this point? Quite honestly, that's kind of by design because you think about this, if I'm sitting on this machine doing a lot of particular work like I'm working with a lot of reposer get, that's the history file that I've been using. So that's the history I'm gonna get predicted to me. So when you switch machines, yeah, unless you, and you can do this by the way, you could pick up that history file off of your current box and drop it onto another box. But yeah, if you switch to another box the history is gonna be different. When you're working though with an additional plugin like I was just working with the Azure PowerShell plugin, those predictions, that comes from a magic server somewhere on the internet. And those predictions will come to you the same regardless of which system you're on. So the historical based ones, yeah, those are system dependent, but the other ones, they're not. Okay, so there's no facilities for me to say for the PS ReadLine to actually say, store the history on my cloud drive or on my one drive. So I've got it access from all of my machines. Not at this time, nope. Not at this time. So if you wanted to. I think there actually is a fanciness here. If you will remind real quick, Jason, running get PS ReadLine option. What that's going to show us is actually where the history file is stored. And so theoretically, if you're the kind of person that brings, you'll see their C, users, JSNH, app data roaming. If you're the kind of person that carries your profile to every machine you have, you can set PS ReadLine option against that history save path. You could put it inside of your one drive and you could have a persistent profile or a persistent history file across all the machines that are configured similarly to that. I would also say that, yeah, nice. I just came up with that. We're out here just being casual. Because I don't think anyone suggested that yet. That's a great idea. But you could also similarly, Cloud Shell is going to have a persistent history because you can set it to, or you could have it set in such a way that that history file is stored in the Azure blob storage that Cloud Shell mounts every time it starts up. So similarly, that's another way that you could have that file. And in fact, you may want to keep those separate. Like it might be that your Cloud Shell history is one history and your every other machine history is another one. So all of that is totally configurable. And I think you could hack it together with all the right pieces. But I don't think we've heard that scenario. It says, I'm interested now, yeah. Well, glad I could help. To your point, PRC, this is why Joey doesn't need predictions because he never forgets anything. Everyone on this call knows that it is not true that I never forget anything. I absolutely forget why. I have no idea what you're talking about, Joey. But I will remember right now to remind Jason, would you mind showing us what module, let's say I've got PS ReadLine 2.2 picked up, what module do I need to find and install in the gallery in order to get these amazing Azure predictions from the magic box in the sky? That is a wonderful question. So open up Bing. Oh, well, I'm trying to open up Bing. Open up your favorite Bing search engine and come on, you can do it. I'm a fan of Bing 3. That's actually my favorite Bing. Yeah, my whatever reason. Look, folks, you're looking for the PowerShell Gallery. So you can find that also. It's just the PowerShellGallery.com. Wow, come on, you can do it. Your big computer, there it goes. Screen sharing is pricey, folks. Upgrade your GPUs if you can find any that exist. Yeah, I've got so many reminders when stock will be and that's not happening anytime soon. Here you go, go ahead and type. Once you get to the PowerShellGallery where all of the modules are, go ahead and type PS ReadLine and what you'll see when it goes out to it is. But I do need, I need one extra module if I want the Azure predictions to work, right? Yes, and so let me speed it out as well. So if you are looking for the Azure predictor, we will also give you a link to their blog if you forget this, but azuretools.picture. The links will be down here. Awesome, you can do it at the gallery and go to and grab it from here, aztoolspredictor or you can, as you saw me doing earlier when I was doing a PS ReadLine, you can find a module aztoolspredictor as well, right? Oh, I'm sorry, you might have already shown that one and I just missed it. No, I actually hadn't. Thank you, sir, for reminding me, that's awesome. So yeah, you can get PS ReadLine, you can get the aztoolspredictor. We're gonna give you the links for this, so you know, in case you forget, get predictions so you don't have to worry about forgetting again. That is fantastic. Super excited. Yeah. Well, Pierre, besides predictions, was that kind of cool, was that? That was absolutely really cool. That it addresses so many pain points for me personally that I'm sure it'll resonate with the audience as well. And this predictor can be customized. The colors can be customized so that you get easier colors to read with all of that. So check it out. I think you'll really enjoy it. I have to say for those of us on the team that have been using this for several months, I don't wanna use a PowerShell without it now. I mean, it's really ingrained. It's great. And when you talk about customizing colors, you're really impressed me if you ever come up with a hot dog theme. Oh no. Okay, never again. Never again. Never again. Never again. Well, one of the other times- If you do have any- Oh, go ahead. Oh no, just before you move there, yeah. If you have any feedback on those default shortcuts, default colors, you think that something could be improved, definitely make sure you hop over to the PS Redline repo, which will either be magically here or at the end of the presentation here to give us that feedback. We're in a pre-release state so that we can fix those things before they end up shipping as production modules. So please, please try it out now. Give us that feedback before it's too late. I will be installing it. This is the minute we finish recording this session. Awesome. Well, let's switch topics for a second. And Pierre, you use the ISC. So PowerShell, Windows PowerShell comes with an editor built right into Windows called the, and I'm emphasizing this word for a reason, Pierre, Windows PowerShell ISC. ISC stands for Integrated Scripting Environment. And this is a great scripting editor for PowerShell on Windows. We love the ISC, but it's on Windows. Did I say that before? Yeah, it's on Windows. And so here's part of the challenge. PowerShell is a cross-platform product. Well, we need a cross-platform editor. That's most important. So when we look at the ISC, as much as we like the ISC, the problem is that there's a lot of features we want to add. We want to add, working in DevOps, you need to be able to work with JSON files, markdown, get. There's all of these things that you want added, but we don't want to invest into this because it's only on Windows. So we have this great new editor. Some of you may have already seen it, but we have this great new editor. I'm going to show you how to get it first or where to get it. And just go to Bing and type in Visual Studio Code. Yeah. And what will happen is is you'll get to the website for Visual Studio Code. This is free. That's first and foremost. It's free and also download for Windows. Sure, but this new editor lets you, it works on Mac, it works on Linux, works on Windows. So it's cross-platform. Well, that works really well for us. So we've been creating features in this editor for you, but we also realized that this might be new to a lot of people. So let me just show you how to get started with this. Once you've downloaded VS Code, you can launch VS Code. I've got the icon right here and I'm going to launch it. And I already have a script in here because we're going to take a look at some crazy things that we can do with VS Code in here. But I want you to notice this is kind of confusing at first. It's got all of these icons down the left. There's one icon on the left I want to start with. When you get VS Code, what you really need is the PowerShell extension for VS Code. That's what gives you all the PowerShell goodness. So when you go to extensions over here, now I already have it in mine, but up here in the search box, if you type PowerShell, you're actually going to see a lot of things for PowerShell. But what I want you to notice is the one that I already have the PowerShell extension here at the top. And also, if you want to be on the bleeding edge with us in some of the latest development that we're doing, you can get the PowerShell preview and that'll have the latest and the greatest in it. Once you install this plugin, now you can start working on your scripts just like you did. Oh, did I say just like you did with the ISC shame? Really? Just like I did? Yeah, I know. This is where, let me get rid of this and just kind of show you. I've got a script in here. Here's one of the benefits the extension has added. I think this is great. So if you are new to VS Code and you're like, wow, this has thrown me off, go up to view. Or you just can't see it in the recording. You got that terrible dark mode. It's like, I can't, I can't see it. Oh, it's in my eyes. It's terrible dark mode. Yeah, so here's the thing. First thing I'm gonna do is I'm gonna go up to the command palette and I'm gonna type the word ISC. What you're gonna see here is you're gonna see enable and disable ISC mode. So if you're coming from the ISC and you wanna make your life easier, click enable ISC mode. It'll take it a second and lo and behold, as it's doing it, you'll see it's flipping it, it's changing the colors, it's making it just the way that I as an ISC user would expect it to be. Now, here's the cool part. This is PowerShell, not that, not the older Windows, this is the new PowerShell. So of course, if I go over to my Linux box, bring up VS Code, running the same script and I go out to view command palette and I say, you know what? I really want this in ISC mode. It's gonna do exactly the same thing on my Mac. So I get beautiful looking ISC in that color form. And hey, you might decide, you know what? I wanna use, I wanna go back to the original VS Code. You can just click and go right back to VS Code style. I'm gonna close the one additional window. So whatever makes you happiest, the important part here is start using VS Code. This is where we're putting all of the new features, all of the things that you need that you're asking for, like all the get support and JSON support, it's here. So come here and get it. We've tried to make it easy for you to be able to get started with it. Pierre, is that kind of cool? Yeah, that's very cool. Cause I have to admit that I've spent an awful lot of time in the editor, mostly when I'm like troubleshooting so I can just like highlight a few lines and say just run those selected lines and see what the result is and then run the next and insert like break points and like try to figure out where my script is actually going wrong. But I can do this, I can see myself doing this in the VS Code instead. Well, you know what? I'm so glad that you just brought that up, as a matter of fact. Almost like it was planned. No, no, no, I'm so glad you brought that up about debugging and all of that, as a matter of fact. Yeah, it's like it was planned, this is awesome. I'm just, let me grab this script again really quick cause I wanted to show you a couple of other things here about VS Code. So I've got this script up. Now I want you to take a notice about some things. We're going to go to great extents to try to help you. We have something called the PowerShell Script Analyzer and with VS Code and the PowerShell Script Analyzer we're gonna help you with some of the editing and some of the best practices to make sure that you're writing some pretty good code that's easier to maintain. I want you to notice these little kind of yellow squigglies. I know it's hard to see, but there's squigglies underneath some of these. I've got this dollar sign A and as I go up here and I hover over it saying variable A is assigned, but it's never used. This comes from the PowerShell Script Analyzer giving me a warning that I've created a variable but you're not using it. Here's the other interesting thing. If you kind of move your mouse down you can peek into this problem and it'll give you more description. You can even get some documentation on this. So I can go, oh, I need to use this variable. So I'm gonna say, okay, just write output dollar sign A. Why did I use it if I didn't want to put it out? So you notice, okay, Script Analyzer says awesome. Thank you for fixing that but I've got something else problem here. When you write scripts, it's not the best practice to use aliases and on Windows, LS is an alias. It's an alias for get child item. As a matter of fact, it's telling me don't use the alias, use get child item. I can peek the problem. It'll give me that information. However, here's the interesting thing. When I go back here, I can not only peek into that problem, but I can go to quick fix. Quick fix will give me the option of automatically, and I think if I click on it here, I got to get my mouse over, oh, I missed it. Is it gonna let me do it one more time? It's gonna give me the option to, yeah, I'll fix it. I'll just replace that alias with the commandlet that that alias points to, which is get child item. Or I can show you that documentation and give you some documentation on avoiding on why you should avoid aliases to begin with. Yeah, cause there might be a very specific reason why I want to use this. Yeah, you know what, as a matter of fact, give you a great example, there might be a reason that you want to use this, so you don't have to follow the rule, but you can certainly continue on. We've got a lot of rules to help you though with best practices, like notice I'm making a function over here, oops, and I gave the function a name, well, PowerShell expects that you have approved verbs for the name. Gimme is not an approved verb. So that's what it's actually gonna tell me is that this is using an unapproved verb. So you can see how beneficial this is. I'm gonna go down to another one here. Here I've created a parameter and I, cause I wanna use this password and I've set up a string as a password and it's warning me, giving me a security warning. Don't do this, you wanna use secure string so that you don't expose this in plain text. Okay, maybe I should have a warning on this and said like, and hard coding passwords in any scripts is not condoned by this panel. Absolutely, but that's really what the idea here is. You're using VS Code, you get all of this stuff for free. Plus you had mentioned, you know, setting break points and debugging. We can do all of that. Take a look at this for each loop that I have here. I'm gonna have this loop iterate and just show the numbers one through 50. Matter of fact, I'll run it for you real quick so you can see it. And I'm gonna hit F8 just to run what I have selected on the screen and you can see down here in the terminal, it's running through those numbers one through 50. Well, let's pretend for a second that I was confused and I'm not too sure what this variable dollar sign I is getting set to. Well, you can go in, that's the wrong line and you can set a break point and let me show you what a break point is. This is where the program execution is gonna stop. So I've set this break point. Now I'm gonna run the script and you're gonna notice a couple of things. If it doesn't auto pop out over here, there's some debug information. Now what I'd like you to notice is I set this break point on dollar sign I because I wanna inspect this. I wanna see what's going on. One of the things you'll notice is, right, there's dollar sign I and it's telling me right now it's a value of one. I can also go down here in the terminal and say, hey, what is dollar sign I? It's a one. Now as I'm in debug mode and there are some key combinations that you can look up, like C to continue. In other words, it's gonna continue and go through this loop again. Yep. So I'm gonna have it continue and I'm gonna check dollar sign I. You can see in the left pane, it's changed to two. If I hit continue again, it's gonna change to three. It's gonna keep doing that all the way through 50 but I want you to notice kind of a line of code I have in here. Hey, if I got an if statement in here, if this is greater than 50, then right output I'm over 50. That's what PowerShell tells me every morning when I sit down anyways. So in this case, what I'm gonna do is I'm gonna say, what's dollar sign I right now? It's set to three. Actually, I wanna see if that if statement works. So dollar sign I equals 51. And I'm gonna continue and boom. You can see that if statement worked. It says, yeah, that's over 50 and goes right back in. The moral of the story here, I think Roman is that the features that you were used to in the ISC like debugging that have gotten better in VS code. And now that VS code offers you the ability to basically look like the ISC but still get all of those features. We want you to go out and grab VS code instead of the ISC use that, flip it into ISC mode if you want, but make sure you're using this that way you can get all of the new features that we have. That's perfect. Makes sense? Yeah, it makes absolute sense. Plus, I can use it everywhere and I don't have to worry about, do I have ISC installed the way, like, that's great. Yeah, I personally, a big, big fan of VS code simply because of all of the things that you don't just write PowerShell scripts anymore. A lot of us working in DevOps and all that have different languages need to work with JSON, makes a lot of sense. Here, there was one other thing I wanted to bring up and this is one of those secret things that you didn't let out of the bag yet that is a recent preview release for us and I'm very, very excited. Now, this is early days, okay? What that means is we still have work to do but I want to give you an idea here. Pierre, how many times have you run IP config back your IP address? Too many times to remember. That's right, we've all done that. This is, now I'm going to define- One of the first commands I ever learned. Exactly. Even worse is running that command and trying to capture the output so I can parse it and find like one little piece of useful information. Yeah, you know what? As a matter of fact, so you probably did the same thing that I did. You can see it up here, right? I want to do select IPv4 address and that's just not going to work. And here's the reason why. First of all, let's define this. The command that I'm running IP config, I refer to as a native command. Here's what a negative native command is. You might think of it as, well, those are those old commands. Okay, some of them are, but there are also brand new native commands like Cube CTL and Docker. These are amazing commands that are very powerful. So we've got some of these older ones that are still really useful and we've got newer ones. And since PowerShells cross platform, we've got native commands both in Windows like IP config and then on Linux like IF config. So how do we make these native commands easier to work with in PowerShell? Well, if you've been working with PowerShell for a while, let me just say, you can today write a PowerShell script that wraps a native command and it makes it look and feel more like PowerShell. However, that requires a pretty unique skill set. A matter of fact, if you have that skill set, you might look to see if that native command uses a REST API and just use auto REST to wrap it. So there are a lot of ways that you can do what I'm about to show you if you have a more developer oriented skill set and are comfortable doing that. But what if you don't have that skill set? I don't have that skills. Well, I do a little bit, but what if you don't have that skill set? I don't, so show me. Right, so here's the thing, IP config, yep. Wouldn't this be cool? IP config, thanks predictor. Works, it's a verb, it's a noun. I can use it in a pipeline, which means this command is producing objects. Joey started this off by talking about how important objects work. Objects so that I could use it down a pipeline with other PowerShell commands. Because I'm using a verb noun name, I can be consistent. It looks like a PowerShell command. And of course, if I do get help on it, there'll be some help there. So is it like every command? Well, if I do like get-dir for directory listing. In fact, let me show you how you get this, right? This is gonna require some work on your part, because I don't know what native commands you're interested in, but you know what native commands you're interested in. So let me show you how to do this. First of all, well, just quite honestly, I just need to show you this right now. Well, I'll show you this in a second. So I'm gonna show you what, where am I, demo? Let's do this, let's go, what did I, oh, actually that's what I wanted. That's what I wanted. So here's what I wanted to show you. We're gonna give you some links for this, but we have a module, you can go out to the gallery, type in the word crescendo, and you're gonna find PowerShell crescendo. What this module does is that it allows you to create or author commandlets out of native commands. So you decide what commands you want, and then you can author it. And we're trying to make this to be a much easier authoring experience. Let me give you a quick example. So I've got something, I've got a JSON file here. Yep. This JSON file is how I'm gonna turn the native command IP config into a more PowerShell-like usable command for me and automation that I wanna set up. That's all I need. So I'm gonna do code, and let me show you what this looks like. Oh, for some reason my code got so much smaller all of a sudden, I'll make it bigger here as soon as it pops up. Come on, let me have my screen back. There we go. Let's make this a little bit bigger. So right now we have a JSON file, and let me show you how this works. There we go, JSON. So you need to have a JSON file. Now we're gonna auto generate at least a template for this for you, but the JSON files are very simpler. They're property and values. So this comes with a scheme, and the scheme is gonna help you to make sure that you're typing in the right things. When I wanna set up a native command, first of all, I decide what verb and noun it gets. So here I typed in get, and I decided I'm gonna call it IP config. The next thing I do is I give it what is the native command? So give me the location to that native command, and if you wanna start putting in some help description, you can. Then you need it to help me understand the JSON file needs to understand what the parameters are gonna be. Now you get to decide how much of this native command you wanna deal with right now. Now IP config, I don't know if you guys know this or not, but IP config actually has a ton of switch options. Now the only ones I've ever used are release and renew, but it's got other switch options. But here's the deal. Flush DNS. Flush DNS. Flush DNS. Because it's always DNS. Yeah, I don't have to sit down and go, oh, I gotta handle all these switch parameters. It wants to know, you only have to deal with the ones you wanna deal with right at this moment. The only ones I wanted to deal with right now in this get of IP config was slash all and all compartments. That's it. So I created those. You put in the original parameter, you put in what you want the parameter name to be on this new command line. Now the tricky part, and this is the part that we're working on is then you can turn it into an object. Now right now this looks pretty scary for IP config. We're working on improving this. This is an output handler that will take all of that string data that comes from the native command, try to understand it, figure it out and then put it onto an object that can move down the pipeline. So crescendo is gonna allow you to wrap the native command within minutes and then pop out objects from it. So when you want to build this, take this JSON and turn it into something that you can use as soon as I can get there we go. Here's what's gonna happen. You have a command let export. Oh thank you predictor, I didn't wanna type all this in. Just so happens that I have three JSON files. Some it lets me get the IP, it lets me release and renew the IP in each one of these JSON files. What I'd like to do is just export this to a PowerShell module. So in my case, thanks predictor, I'm gonna export this to ipconfig.psm1. Now that module already exists on my system, that's why I'm getting the error message, but at that point all you need to do is import that module. I'm gonna show that to you in just a second, but let me give you this. Here's the module that was made. Now what's inside of that module? What did Crescendo do for me? Here's what Crescendo did for me. I'm gonna show you what's in that module. Not everybody has seen this, but what Crescendo does is it takes that JSON file and it builds proxy commandlets into this module for you. Here's the beautiful thing of this module and these proxy commandlets. You didn't have to write any of that code. It was all for free. All you need to do is import the module. Now you can use it, but here's the beautiful part. I'm gonna go over to Windows PowerShell and let me see here. I've got cdip, I'm gonna go in there. I have that generated module. The module that I generated in PowerShell 7, I've got sitting right here. Let's see what happens. Import module. Thank you, Victor. That works. In other words, the point here. The modules that get generated work down level to Windows PowerShell 5.1. The reason is, is that, think about this. The reason we're doing this is so that you can make native commands more PowerShell-like so you can use them in your automation. Well, I wanna automate stuff across, whether it be on-prem or in the cloud, I wanna automate across my systems. I can get a module to them, I can deploy a module. This will now give me the ability to write that automation and use that automation the way that I, as a PowerShell user, am more comfortable with. So, and oh, hey, this all works, cross-platform. Now in this case, IP config does not work on a Linux box, okay? That's only Windows, but I've got a couple over here for you. Hey, if you're a Linux person, you use who? And so I've got one wrap for who and I don't know, I wrap one for LS. By the way, when you go out to the PS Gallery and you download the Crescendo module, these samples of both Linux and Windows are already in there to help get you started. We've got a blog post on the announcement to help get you started as well. Because that was gonna be my next question is, is there some templates I can start using? But if the samples were already pre-installed or pre-included in the module, then that's perfect. You betcha. And we'll get you started with our announcement blog that of course, Pierre, we're gonna give you the links to when we're all done here. So that getting the module, getting started with the module, getting set up for the first time, we're gonna help you with that. Early days, and we still have a lot of work to do, but we encourage you to come out to the GitHub repo for Crescendo, which again, we're gonna give you the links to and talk to us, discuss with us, file issues on us, let us know how it's working out for you. Yeah, I'm actually blown away. And now I'm almost like, okay, let's end this so I can go and load those modules and start playing with this. But I wanna continue this conversation because it's blowing my mind. I was expecting like, okay, I understand PowerShell and like we'll deep dive into like the PowerShell seven, the differences and how we go from one to the other. But like though you're, you've surprised me. I'm not easily surprised normally. So this is a good thing. I'm enjoying that. And what I'm hoping is that you and all your friends, cause I'm kind of surprised too. And this is really cool stuff. And some people that are still using Windows PowerShell 5.1, they're missing some of these, they're missing these great benefits. So yeah, tell your friends. And this doesn't matter if you're, as you mentioned, if you're an experienced PowerShell script writer or user, or if you're just brand new to it, every level of a user or power user is gonna benefit from those enhancement into PowerShell. Yeah, absolutely. And one of the things I wanna point out here actually, specifically in that regard is that, I think one of the important parts about decoupling the generation of these Crescendo modules from the actual execution of them is that users can and we hope and expect for folks to build open source Crescendo modules around these schemas, right? And the schema is basically just a mapping file. Your source code is just the schema file. And then, you know, your CICD pipeline is to run the Crescendo to generate it and publish it to the gallery. So the hope is that for that super long tail of random switches on something like IP Config, or you know, I think one of the ones I expect some folks to go in pretty hard on immediately is RoboCopy. And it's, you know, it's 75 switches or whatever. So, you know, like if those are managed in the community, we can really get a collaborative effort going where folks can all, you know, contribute pull requests that add support for the switches that they care about so that one day, you know, we can have much greater PowerShell coverage of a lot of these things, you know, in that sort of distributed nature of leveraging, you know, all the brilliant folks in the PowerShell ecosystem. So, please do that. And sometimes you're looking at code and you need to do something that you think is very niche and that nobody else is going to need. And when you realize that you start searching online and you get some articles on like Stack Overflow or elsewhere where you're not the only one, there's like a hundred people that are waiting for somebody to come up with something like that because they want to leverage it. Rarely, maybe never have I been the first person to try something. And I think even for new features that we ship, in many, many cases, people have built hacks or workarounds to get to that point and we're just taking that idea and, you know, first partying it straight into the engine in sort of a more native way. But yeah, it's, you know, the PowerShell ecosystem is so massive at this point. There's nothing totally brand new out there. So, you know, leverage your peers, leverage the community and get back. Absolutely. And that way you don't have to like build something that's held together with bubble gum and duct tape. Exactly. All right, cool. So where are we at now? I think we've got one more set. We're going to get through this here. You know, not that this is painful or anything. I mean, I think we're just talking about awesome PowerShell goodness. So it's been very fun. But we've got one more demo here from yours truly on secret management. I am filling in here for Sydney Smith, who's the PM on secret management and secret store modules. But we're just going to show a brief demo here. So secret management is basically, to give a quick description, it's a universal abstraction layer for the management of secrets in arbitrary secret vaults, right? So what do we mean by this? Today, when you want to leverage a secret inside of your script, you need to do some custom handling. You're either using certificates in conjunction with CliaxML or you're using some sort of, you know, custom solution in your CACD pipeline. Maybe you're leveraging something like Azure Key Vault. Maybe you're using, you know, Kubernetes to store your secrets. There's a number of different ways people use hash heap corpse vault that you could, you know, store these secrets and ultimately retrieve them in an automated fashion in a safe and secure way. But what that means is that when you actually build out a script that needs that secret, you need to hard code the logic of how to retrieve that secret directly into the script based on the secret solution that you're using to store that secret, right? So what we've done here is we've built an interface that's a pluggable interface that leverages commands like get secret vault, get secret info set and get secret as a way to allow you to write generic modules and scripts that work across arbitrary vaults. And then you simply configure your machine ahead of time in sort of a pre-step to, you know, register the correct secret vault extension and then to register the secret vault that already exists, you know, this is not a solution for creating secret vaults or for, you know, you're not instantiating an Azure Key Vault here, but you register an existing Azure Key Vault and you simply say, hey, this is the secret I want to use. This could be parameterized. You know, that secret right there is the one I want to use on my machine and then I want to run this generic get secret code, you know, where that secret gets leveraged in some other sort of module, right? And so this allows for more genericization. Oops, I lost my little, ah, lost my guy here. You know, you can genericize modules that need secrets without necessarily hard coding them to a specific secret, right? So if it turns out you want to use your local credential store instead of Azure Key Vault, you can still run that module on the gallery that is, you know, meeting some sort of secure secret store in order to work. So I won't run all of the commands here because some of these are just intended to demonstrate here, right, you know, for instance, install module. This is how I actually get the secret store module. This will install secret management separately as it depends as secret store is dependent on secret management. I'll talk briefly about secret store. This is essentially a vault extension that has been written by us and will be supported by us when this goes GA and it's a local secret store that works cross-platform using.net in order to securely store any secrets that you may have on that one local machine, right? So this might not be what you want to use in your CI CD pipeline because it's leveraged more for interactive usage. But, you know, when you're using your local box, you know, it's gonna prompt you for password. It's very similar to any other local password manager but it does work across Windows, Mac, and Linux and it's fully integrated with secret management. So once I've got these installed, go ahead, go ahead. I was gonna say anything that helps with pulling hard-coded credentials out of scripts and config files is a good thing. Yes, I would definitely agree with you there. We're gonna switch over to this light thing here just to make sure we're fully visible. But as you can see, I'm gonna make my font just one bigger. We went ahead and ran get module, Microsoft, that PowerShell, that secret star and you can see, that didn't want me to set the theme. I don't know, everything got smaller and then it went back to the car. That's okay. We'll just do one more. Let's do it again more. Okay. So here we can see there are no secret vaults currently registered. So we're gonna go ahead and create a new one here. I am gonna run one extra command here which is to set secret vault. This is just gonna make sure that my, I don't really set, excuse me, I probably need to have this one. Oh, now what this is gonna do is just make sure that I have a password. This is like the past phrase that I use for unlocking my secret story. Definitely shouldn't use this one. I'm gonna use password 123. Don't do that. We can now register this secret vault. So we're gonna use the module name here refers to the vault extension which is secret store. And then the, as you can see on this one too. So these are all the commands that are available in secret management, right? So we have the ability to register and register secret vaults, get it, set it and remove secrets, you know, get info on secrets and so on. So we're gonna go ahead and make one because right now we haven't done secret vaults as we showed earlier. And now you can see that we have a secret vault. That's awesome. Here's the secret store. And you can see we have no secrets installed on the thing. Okay. Let's go ahead and create one. So we're gonna just use the set secret here. I created a script called two. And that's going to prompt us at the command line. This is going to ensure using, you know, secure input here that we're not logging this password to the transcript or the history that Jason was referring to in PS Readline because we don't want this credential store to be persistently in plain text. That's the whole point of secret management. And so here it's asking for a secure sync string secret. I'm gonna go ahead and put in this is super secret. Now it's gonna get stored there. All right, so now if we run get secret info, you'll see we have a secret called foo of tight secure string. We have an epic secret that is going to return the type as a secure string. So we don't want, you know, to be displaying this right into the terminal again because it's not logged into the transcript. But, you know, we can leverage this secure string in a bunch of commands provided that they're properly configured, you know, to take secure string input. Let's say that you're using a native tool like QPCTL and maybe it hasn't been wrapped by Christian yet. And you want to be able to pass this input into a parameter in vacation. So that's something like foo bar.exe and it's got a M for password or something like that. And then put it into there. Get secret foo as plain. And so that is a safe way to pass it directly to that native executable. And we'll show what that resolves to here and you'll see, you know, if you do know what you're doing, I mean, you're okay with this because this isn't a real secret, it's fine. You'll see how you can plain text version. This is super secret, right? So let's go and help with that. And you can do this to the local secure store and you can target Azure Vault or any other like secret repository really. Yes, yes. I'm actually going to show right here. This is just a very, very briefly the timeout information here. So this just says, hey, we can configure secret store. It's got a password timing that's going to prompt for that pass phrase we used before. We can set that to zero, which basically means I'm going to get prompted every time I try to retrieve the secret. So if we were going to get a secret foo, you know, it's going to say, hey, what do you mean that's not going to be one, two, three in there and then we'll return that. It'll ask for that every single time. But if we set, you know, these two are configuration two is 1000 and we're going to give it once and then for a thousand seconds we'll just continue to work. All right. So similarly this interaction none means it will not allow me to do it at all unless I manually run this unlock secret store manually. But we can always put our suspects to default. So what you're discussing is, hey, what about another vault extension? Yep, we've already got one of those. It's built for Azure Key Vault. Again, this is working already with Azure Key Vault 3.3.0. You can see that we have that installed, fantastic. And then we're going to go ahead and set some variables here and we're going to register another secret vault which has already exists on the remote end and you'll see we're passing in this hash table of vault parameters, right? So the Azure Key Vault name is that vault name we set, subscription ID is subscription ID, fantastic. We've registered that. That does not require internet access that hopefully just works here. This was something we were having a little bit of difficulty with earlier, but yes, great work. I'm going to go ahead and connect up to Azure because retrieving those actual secret vault information and secrets themselves is going to require us to authenticate. And so while that's happening, I'm going to pop over to the Azure portal work where you'll see that we've already created this test vault in this portal organization here. This is the Azure Connect AZ account, man, like asking me for interactive inputs. We're going to go ahead and log in. But you'll see we've got this test secret here, which means that when we go back to the S code, we should be able to run against secret vault in order to see that, okay, yeah, that's AZKV. That's the one that we registered. It's not our default vaults. We will have to specify it especially. So we specify it just like that. That's your info dash vault AZKV. And you'll see that that test secret exists right there. So we can actually retrieve a test secret. We can do the same thing. So we're going to add a plain text. That's right, that's a secret. And that is the name of the secret. You'll see that's actually going out to the internet to get HuBarBaz, right? Similarly, I can create a secret. So we're going to create one called, using set secret called HuBar. And we're going to put in thanks for a great talk. And then if we switch over back to our browser, you'll see that indeed we created a HuBar of type secure string, you can take it, you get it. No, I've got my special master here turned on. Show secret value. Thanks for a great talk. There it is. This is fantastic. I don't know how many times I've had to write and in like 50 times in the script, I have to like stop and prop up that little message box. There's the enter password here, get credentials, like because I'm accessing, but I don't want to store it anywhere and I don't want to, so this is gonna help. You still will need to bootstrap your one credential in terms of connecting to Azure here, right? Yeah, but what? You still need, but only once. But only once. And then you're good for the rest of your commandment. And again, like it's modularizing that, that, you know, shareability of scripts and modules such that I can, you know, I can simply swap out my script that's getting and setting secrets and I could, you know, put a parameterized value into that vault name. And I don't care about what kind of vault extensions being used. I don't care about whether it's over the wire on my local box. I could be going from a dev to a test to a prod environment. I could be doing multi-cloud. I could be going from on-prem to cloud. It doesn't matter. I'm always just running get set remove secret and that's it. So this thing's gonna GA hopefully within the next couple of months. We are gonna be releasing a second release candidate very soon. I wanna just go over very, very quickly. I know we're burning up tons of time here, but we've just got one more slide or two more slides here that just demonstrate, hey, this is a ton of resources for you. All the repositories that we got with all these modules, file issues, contribute to stuff, find us on Twitter, that PowerShell 7 module compatibility table, everything in Windows that works straight with PowerShell 7. We've got community calls on the third Thursday of every month. Please join us on those. You can ask anything you want. Get the straight answer from the entire engineering team. Install documentation, our team blog with updates on all these things you could stay on the cutting edge. Docker container images, that AZ predictor module that Jason was talking about. Everything's here. And of course, we have a phenomenal community of folks that are out there answering questions in real time on Slack, Discord, IRC, PowerShell.org forms, Stack Overflow forms, Reddit slash R slash PowerShell, Spiceworks, tons of awesome books. There's way more than this, but regrettably we only had so much space. And then in-person user groups are another fantastic way, especially post-pandemic, to meet like-minded folks. Although a lot of those are being hosted virtually now. So look into your local geography and find out where you can engage with other people about PowerShell and really help grow our ecosystem. So I just want to thank everybody again for the time. Yeah, it's been awesome. I want to thank you both for taking this time and I want to remind our audience, I'm just going to put that up here, that for this week, we do have a Discord, our own Discord server that you can, if you watch this session and you've got question, I go to aka.ms slash ops 117 dash chat. This takes you to our Discord server where we have a text channel dedicated to answering and having this conversation. And of course, we're going to have information in that, that is going to take you to a copy of the deck that you can get for all the resources that are in it. And so on. So thank you both, Jason and Joey. This was actually fantastic. I made a couple of notes of lists of things that I'm going to go and try right away. It's Friday night, but a dinner can wait. The kids can fend for themselves. I'm just going to go out and try these out on my machine at home right now. And actually, I'm going to try that little hack about moving my PS3... Yeah, yeah. I want to know if that one works for OneDrive. Yeah, the OneDrive-based PS3, you'd like us to do it. OneDrive, yep. We did just fix an issue with junction reparse points in 7.1.1 and 7.0.4. So if you're doing OneDrive stuff and you haven't updated yet, get the latest latest version there, FYI. All right. Well, thank you very much, you guys. This was actually really fantastic. I really enjoyed it. And for you guys at home watching, make sure to connect with us on aka.ms slash ITOpsTalks with an S, where are you going to get the listing of all of the sessions we have here and connect with us on the Discord at ITOpsTalk-Discord. And with that, thank you very much. Thank you guys. Thanks, folks. See you in the Discord.