#PS7Now! PowerShell 7 Is Here!
This #PSBlogWeek focuses on the official release of PowerShell 7 — the newest, fastest, and best PowerShell putting the spotlight on PowerShell’s Experimental Features.
Get #PS7Now to experience them yourself!
Experimental Features Defined
After becoming open-source software, the PowerShell community requested a mechanism for users to try out new features and provide early feedback to feature developers. This discussion took place in PowerShell RFC0029 which was finalized and implemented in PowerShell Core 6.1.
New features that are not production ready are deemed experimental in nature. Users can choose to opt-in for an experimental feature on an individual basis. Administrators can choose to opt-in at the system level.
Please note that user configuration will take precedence over system configuration.
Using the built-in support for experimental features, developers can roll out an alternate command or a parameter to their modules.
Experimental features are not limited to the PowerShell engine itself.
Experimental Feature Commands
Commands to discover, enable, and disable experimental features are provided to the user.
Get-ExperimentalFeature
The command Get-ExperimentalFeature
will display a list of discovered experimental features.
These features can come from the PowerShell engine itself or from modules.
You can see where the experimental feature is defined by looking at the Source column in the command’s output.
Also, features can be specific to an operating system as the following illustrates.
Notice the PSUnixFileStat
feature in the Linux output.
Experimental Features on Windows
Experimental Features on Linux
Experimental feature discovery targets the paths in $env:PSModulePath
.
Enable-ExperimentalFeature
The Enable-ExperimentalFeature
command turns on one or more experimental features for the current user or all users.
Enabling a feature will add it to an array in the ExperimentalFeatures
key in the Powershell configuration file, powershell.config.json
.
If you do not specify a Scope
, it will default to CurrentUser
.
For Windows, the user configuration file will be saved in the $HOME\Documents\PowerShell
folder.
For Linux, the user configuration file will be saved in the $HOME\.config\powershell
folder.
Note:
On my system, I re-target my Documents folder to a separate volume.
The PowerShell configuration file is saved there and is not in the $HOME
hierarchy.
You can turn on all experimental features in one line. In the following example, I’ve added a sanity check by getting the content of the configuration file.
Restart Sessions
Take note of the warning message that serves as a reminder to restart the PowerShell session. In fact, I believe you will need to close all console sessions (those of the same version and platform, that is) before the change will take effect.
Don’t forget the stop the terminal in Visual Studio Code.
Disable-ExperimentalFeature
The Disable-ExperimentalFeature
command turns off the experimental feature.
As with enabling, when you disable one or more features, you must close all PowerShell sessions and start a new session.
Disabling the feature removes its entry from the enabled feature list in the appropriate configuration file. The ExperimentalFeatures key will remain even if you disable all experimental features.
PSUnixFileStat In Action
Now that we’ve talked about Experimental Features and how to enable/disable them, let’s take one out for a spin.
One of the features that Linux admins would probably appreciate is the PSUnixFileStat
feature.
Let’s get some information about it.
The default output for Get-ChildItem
looks the same on Windows or Linux.
The output doesn’t help the Linux admin with permissions. Let’s enable the feature and correct that.
I close all PowerShell sessions in my WSL instance and start a new one. And now to see the difference.
Those new UnixMode entries look much more useful (and are super cool).
This is PowerShell on Linux!
PSCommandNotFoundSuggestion In Action
Let’s take a quick look at another experimental feature.
I meant to type git, not get.
With the PSCommandNotFoundSuggestion experimental feature enabled, PowerShell can suggest commands when we have a typo or just space out.
Thanks, PowerShell!
Adding Support for an Experimental Feature to Your Module
As I mentioned at the beginning of this article, experimental features are not limited to the PowerShell engine.
In fact, there are a couple delivered with PowerShell 7 within the modules Microsoft.PowerShell.Utility
and PSDesiredStateConfiguration
.
I wanted to provide the community a working demo of experimental features, but I couldn’t find any online.
My google-foo is strong, but it either failed me this time or there are no current examples in the wild.
I wrote a very simple demo module that contains experimental features. You can find it at the bottom of this article.
Module Manifest
In the Module Experimental Feature section of RFC0029, I found where experimental feature support can be added to a module manifest.
In the PrivateData.PSData
section, there is a new ExperimentalFeatures entry which allows an array
of hashtables with Name and Description.
This metadata has been incorporated into the necessary components to update the PSModuleInfo
object.
Feature Naming
When I was creating the demo module, I originally created a feature name like PSDemoFeature. I quickly discovered this was not the correct naming scheme for experimental features.
It became evident when I tested my demo module manifest.
PS> Test-ModuleManifest 'C:\Program Files\PowerShell\Modules\DemoExperimentalFeatures\DemoExperimentalFeatures.psd1'
Test-ModuleManifest: One or more invalid experimental feature names found: PSDemoExpFeature. A module experimental feature name should follow this convention: 'ModuleName.FeatureName'.
Be sure to use the proper naming scheme for your experimental features. The name must be in the format of ModuleName.FeatureName.
The name of PowerShell engine experimental features is PSDescriptiveText. Once I realized this, I removed the PS from my feature names to reduce any confusion.
Experimental Attribute
The about_Experimental_Feature documentation goes
into detail on how to use the new Experimental
attribute.
[Experimental(NameOfExperimentalFeature, ExperimentAction)]
This attribute can be used for the function or any parameter.
The ExperimentAction
is an enum
with values of Hide
or Show
.
Show
will allow the experimental feature to be used when it’s enabled.
Hide
will prohibit the experimental feature to be used when it’s enabled.
They can be used to provide mutual exclusivity between different versions of a command or parameter.
Additional Information
Refer to the about_Experimental_Feature documentation
for examples of C#
and how to check if an experimental feature is enabled.
The latter would be necessary when you don’t need mutual exclusivity and when writing Pester tests for your code.
When I get extra time, I’ll add another function that uses the experimental feature check.
Demo Module with Experimental Features (Mutually Exclusive)
#PS7Now #PSBlogWeek Contributors
Be sure to watch for more #PS7Now! #PSBlogWeek articles from my fellow contributors and myself. And be sure to follow us on Twitter and add our blogs to your feed reader. We can help you on your PowerShell enlightenment journey, along with many others in the PowerShell community.
Author | Blog | |
---|---|---|
Adam Bertram | @adbertram | https://adamtheautomator.com/ |
Dave Carroll | @thedavecarroll | https://powershell.anovelidea.org/ |
Josh Duffney | @joshduffney | http://duffney.io/ |
Dan Franciscus | @danfranciscus | https://winsysblog.com/ |
Jeff Hicks | @jeffhicks | https://jdhitsolutions.com/ |
Mike Kanakos | @MikeKanakos | https://www.networkadm.in/ |
Josh King | @WindosNZ | https://toastit.dev/ |
Thomas Lee | @doctordns | https://tfl09.blogspot.com/ |
Tommy Maynard | @thetommymaynard | https://tommymaynard.com/ |
Jonathan Medd | @jonathanmedd | https://www.jonathanmedd.net/ |
Prateek Singh | @singhprateik | https://ridicurious.com/ |
Summary
I believe module developers will start delivering experimental features as they migrate to PowerShell 7, especially if their modules support mission critical automation and processes.
Thank you for taking the time to read this article and for being part of the PowerShell community.
You are the reason we do what we do!
If you haven’t already, begin your journey with PowerShell 7 now!
Comments Appear to be Down I just realized that my comments aren’t working. I’ll be looking into that as soon as I can. Until I get them back online, you can reach out to me on Twitter or via a comment on the GitHub Gist.
Leave a comment