PowerShell Command Naming: Approved Verbs, Clear Nouns, and Better APIs
The difference between a PowerShell command that feels native and one that feels bolted on is often not the implementation. It's the name. In PowerShell, names are part of the interface contract: they drive discoverability, shape user expectations, and determine whether your module behaves like a first-class citizen or like a private script someone published by accident.
Official References
Start with the official documentation for approved verbs, Get-Verb, and the PSScriptAnalyzer rule UseApprovedVerbs.
If you maintain PowerShell modules long enough, you start to see the same mistakes over and over:
- Functions named with verbs PowerShell doesn't recognize
- Plural nouns where PowerShell expects singular object names
- Verb choices that imply one behavior while the function performs another
- "Do everything" verbs like
Invokeused as a substitute for design - State-changing commands that don't support
-WhatIfand-Confirm
This post is about avoiding those mistakes and building command names that feel idiomatic, predictable, and maintainable.
A bad command name spreads farther than you might expect. It shows up in documentation, examples, tab completion, issue reports, code review comments, CI logs, and muscle memory. Once users learn the wrong name, you either carry it forward forever or you break them later when you fix it.
PowerShell isn't just a shell. It's a command discovery environment. Users don't need to remember your entire module if your names fit the ecosystem. They can find commands through patterns:
Get-Command -Verb Get
Get-Command -Module My.Module
Get-Command -Noun VcfCluster
Get-Help Get-VcfCluster -Full
Get-Verb
That only works well when command names follow the conventions the engine, the help system, and the user all expect.
The best PowerShell command names are easy to guess. If I know your module has a cluster object, I should be able to guess that retrieval is probably Get-Thing, creation is probably New-Thing, mutation is probably Set-Thing, deletion is probably Remove-Thing, and validation is probably Test-Thing. If your module breaks that expectation, you increase the amount of documentation the user must read before they can do anything useful.