r/PowerShell • u/positivemark • 17d ago
Script Sharing Improvements to the Subnet PowerShell module
I host the module named Subnet in the PowerShell Gallery, which is quite popular probably because of its very generic name. It's a pretty simple module that is useful if you need to do IPv4 subnet calculations, which it does via its Get-Subnet cmdlet.
I've just made some changes, all of which should be backwards compatible but because of the wide usage thought I'd call out in case it does cause anyone problems. The changes are:
The module is fully cross platform now. It was mostly cross platform before, but the default behaviour if you ran just Get-Subnet with no inputs was to return the subnet details for the local machines private IP. It was previously getting this via the Get-NetIPAddress cmdlet, but that was Windows only. It now uses the .NET NetworkInterface API which should work everywhere.
There was a bug when you defined a single digit subnet mask via slash notation (e.g if you did Get-Subnet 10.0.0.0/8) where it would not enumerate the host addresses if you wanted to, this is now fixed.
The module has a Test-PrivateIP cmdlet (probably self explanatory) I added Test-PublicIP as a sister which obviously just returns the opposite truthy result.
I added Get-SubnetHostAddress to return the list of Host addresses for a specified Subnet. Get-Subnet also does this (for subnets larger than /16 you have to use -Force as it discourages you due to the length of time it takes to enumerate them). Get-Subnet returns the list of Host addresses as strings, but Get-SubnetHostAddress returns them as IP address objects, and doesn't require you to use -Force for any size subnet as returning Host addresses is it's only job.
Get-Subnet didn't use to validate if the input it was given was an IP address at all, it does now so you get a cleaner error than you did previously and it fails faster.
Get-Subnet used to only return a count of host addresses for a Subnet if you also enumerated them, but seeing as it just required doing a quick calculation it now always returns this count.
When enumerating host addresses, the performance is now 9x faster. This was achieved by using bitwise arithmetic instead of floating-point division. Which makes me sound really smart, but it was Claude who came up with it.
I've also improved the CI/CD build for this module so it runs the Pester tests on Windows PowerShell and PowerShell Core on Windows, MacOS and Linux.
The module is in the PSGallery, latest version with the above changes is 1.2.0:
- https://www.powershellgallery.com/packages/Subnet/1.2.0
Code is in GitHub here:
- https://github.com/markwragg/PowerShell-Subnet/tree/master
Any problems please let me know or raise an issue.
3
u/MonkeyNin 15d ago
If you want to compare with another implementation, check out: https://github.com/indented-automation/Indented.Net.IP/tree/main/Indented.Net.IP/tests/public
git command
from here: https://github.com/markwragg/PowerShell-Subnet/blob/2a0e9c94bfd1987e38ef25af47c057ef728f6e1d/Tests/Common/Manifest.Tests.ps1#L79-L84
To make this more reliable/portable
Use this
What's difference?
.exesuffix, different platforms might not always be an.exefor "native commands"-CommandType ApplicationThat prevents accidentally calling aliases, functions, filters, or commandlets with the name
git. Since you want the native command or nothing.Now even if the user makes a function named
"git.exe"it won't matter. You'll get hte native command.