Exploring PowerShell 6 - A Better Split-Path

PowerShell Core 6.0 is out! There’s a ton of new features and even some old commands are getting some love. Today we’re gonna talk about some of the improvements that made it into Split-Path. Let’s dive in and see what the team brought us.

The Good Stuff: There’s a new improved Split-Path with a couple quality of life changes, check it out!

Getting an Extension

Finding a file extension is a pretty common task. We had a couple of ways to do this before Powershell 6.0 was released, but none of which were straightforward. The first way was using Get-Item. This worked because Get-Item returned a System.IO.FileInfo object with an extension property we could inspect. Here’s an example that will get the extension of our PowerShell profile (spoiler alert, it’s going to be .ps1).

(Get-Item $PROFILE).Extension

Now if you didn’t have a profile, you might have noticed the first disadvantage of this method. For Get-Item to work, your file must exist. As you can imagine there’s plenty of scripting scenarios where this isn’t possible. To get around this, we can call a dot net method from System.IO.Path class, GetExtension. Here’s an example trying this on a file that doesn’t exist.


This works but doesn’t feel PowerShelly. Well now in PowerShell 6, all we have to do is call Split-Path. There’s been a new switch added, -Extension that does just this. Here’s what it looks like. Noticed it also works for non-existent files.

Split-Path 'C:\temp\fakefile.txt' -Extension

Getting Just The Filename

Another common scenario we run into is when you have a path, and you need the filename without the extension. Previously there were two ways to accomplish this. The first was using Get-Item but this time returning BaseName property.

(Get-Item $PROFILE).BaseName

Remember though, this only worked if our file existed. Again we could use dot net to work around this.


In PowerShell 6, we can do the same thing with Split-Path, this time we’ll use the -LeafBase. Here’s what that looks like.

Split-Path 'C:\temp\fakefile.txt' -LeafBase

Splitting a UNC

Here’s a neat one. Previous to PowerShell 6, the Split-Path command didn’t work on UNC roots. For example, if ran Split-Path -Path \\server\share you would get a null result. To get this info, we would need to use Regex. Here’s what that would look like to get the server name for a UNC path.

if("\\server\share" -match '(?<ServerName>^\\\\([a-z0-9_.$-]+))\\(?<ShareName>([a-z0-9_.$-]+))')

Simple right… Here’s a similar approach to pick out the leaf, or share name.

if("\\server\share" -match '(?<ServerName>^\\\\([a-z0-9_.$-]+))\\(?<ShareName>([a-z0-9_.$-]+))')

Thankfully in PowerShell 6,Split-Path just works on UNC roots. You can use both -Parent or -Leaf and forget all about that regex gibberish. Pretty cool right? So what’s your favorite new little feature of PowerShell 6?

Written on January 24, 2018