Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
241 changes: 241 additions & 0 deletions terminology.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
---
ms.date: 01/05/2026
---
# Terminology and format guidelines

When writing about PowerShell, use the following terminology guidelines to ensure consistency across
documentation. This is a draft document that's subject to change. Eventually, we will move this
content to the PowerShell-Docs style guide.

## Punctuation

For general rules, see [Punctuation - Microsoft Style Guide][01].

For PowerShell-specific terminology, see [PowerShell-Docs style guide][03].

### Hyphenation

See [Hyphens - Microsoft Style Guide][08].

In general, don't include a hyphen after prefixes unless omitting the hyphen could confuse the
reader. See the style guide for specific examples.

- _subexpression_ not _sub-expression_

Hyphenate two or more words that precede and modify a noun.

- dot-source

Use the _dot-source operator_ to _dot-source_ a script.

- _built-in_ drive
- _high-level-language_ compiler
- _member-access_ operator

## Capitalization and space conventions

For general guidelines, see [Capitalization - Microsoft Style Guide][07]. For PowerShell:

Microsoft product names have specific capitalization requirements that must be followed. See
[Microsoft Product Style Guide][05].

All keywords should be lowercase and backticked in a paragraph. See [about_Language_Keywords][02].
When referring to statements that consist of multiple keywords, use slashes to separate the
keywords rather than spaces or dashes.

- `do/until`
- `do/while`
- `try/catch/finally`
- `if/elseif/else`

Example:

> A `do/until` loop consists of a `do` statement block followed by `until` and a
> conditional expression.

Command names and parameters usually use PascalCase, but verify the correct casing by inspecting the
command definitions.

For example, the parameters of the `TabExpansion2` function don't use PascalCase:

```powershell
TabExpansion2 -inputScript "TabExpansion2 -" | Select-Object -ExpandProperty CompletionMatches
```

```Output
CompletionText ListItemText ResultType ToolTip
-------------- ------------ ---------- -------
-inputScript inputScript ParameterName [string] inputScript
-cursorColumn cursorColumn ParameterName [int] cursorColumn
-ast ast ParameterName [Ast] ast
-tokens tokens ParameterName [Token[]] tokens
-positionOfCursor positionOfCursor ParameterName [IScriptPosition] positionOfCursor
-options options ParameterName [hashtable] options
-Verbose Verbose ParameterName [switch] Verbose
-Debug Debug ParameterName [switch] Debug
-ErrorAction ErrorAction ParameterName [ActionPreference] ErrorAction
-WarningAction WarningAction ParameterName [ActionPreference] WarningAction
-InformationAction InformationAction ParameterName [ActionPreference] InformationAction
-ProgressAction ProgressAction ParameterName [ActionPreference] ProgressAction
-ErrorVariable ErrorVariable ParameterName [string] ErrorVariable
-WarningVariable WarningVariable ParameterName [string] WarningVariable
-InformationVariable InformationVariable ParameterName [string] InformationVariable
-OutVariable OutVariable ParameterName [string] OutVariable
-OutBuffer OutBuffer ParameterName [int] OutBuffer
-PipelineVariable PipelineVariable ParameterName [string] PipelineVariable
```

### Specific examples

- _file system_
- _file name_
- _localhost_ - lowercase
- _CIM session_ - refers to the concept of a CIM session
- _CimSession_ - refers to the PowerShell object of type `[CimSession]`
- _PSSnapin_ - refers to an instance of a PowerShell snap-in assembly (such as
Microsoft.PowerShell.Core)
- _snap-in_ - the general term for a PowerShell snap-in assembly
- _SDDL_ - abbreviation of Security Descriptor Definition Language
- _WSMan_ and _WinRM_
- _WSMan_ - Microsoft's abbreviation for the WS-Management (Web Services-Management) open standard
- _WinRM_ - Windows Remote Management - Microsoft's implementation of the WSMan standard
- Use lowercase instances only where the name is lowercase in the service interfaces (such as
`winrm` command-line tool, or in schema URIs and other properties).
- Variable scopes and scope modifiers

See [Appendix A - Grammar - B.1.6 Variables][04].

Scope names and modifiers are capitalized:

- `Global:` and **Global** scope
- `Local:` and **Local** scope
- `Script:` and **Script** scope
- `Private:`
- `Using:`
- `Workflow:`

PowerShell drive names such as `Env` are capitalized.

```powershell
Get-Item -Path Env:COMPUTERNAME

Name Value
---- -----
COMPUTERNAME COMPUTER01
```

`Env` is a special case when used in variable namespace notation.
Use lowercase for `$env:`. For all other PowerShell drives, use normal
capitalization.

```powershell
$env:COMPUTERNAME
COMPUTER01

$Alias:dir
Get-ChildItem
```

## Terms

### Declare vs. initialize

_Initialize_ is the correct term to use when referring to assigning a value to a variable for the
first time.

The `New-Variable` cmdlet is used to declare variables. This is the only way to create a variable
without a value. When you don't provide a value, the value is set to `$null` by default.

When you reference a variable that hasn't been declared yet (such as `$var`) for the first time,
PowerShell creates the variable. If you didn't initialize the variable, PowerShell assigns a default
value depending on its type. Variables that are not explicitly typed are assigned a value of
`$null`. In practice, it's difficult to create a variable without initializing it.

### Native vs. external commands

Not all external commands are native commands. A PowerShell script can be an _external command_, but
it's not a native command.

_Native commands_ are executables that can be run from any shell or other invocation method
supported by the OS.

### Scalar vs. single vs. singleton
Copy link
Contributor

@surfingoldelephant surfingoldelephant Jan 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Scalar" is most commonly used in reference to scalars vs collections in PowerShell. E.g.,

"When the left-hand side operand is a scalar value, -eq returns a boolean value. When the operand is a collection, -eq acts as a filter and returns matching items from the collection.

I think this section should specifically draw the comparison between scalar vs collection.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, that is not really accurate. It should be singleton instead of scalar.


See [Scalar data type - Wikipedia][10].

A scalar data type, or just scalar, is any non-composite value.

Generally, all basic primitive data types are considered scalar:

- The Boolean data type (bool)
- Numeric types (int, the floating point types float and double)
- Character types (char)

The term _single_ should only refer to a single-precision floating point type `[single]`.

A _singleton_ is a single instance of an object that may be scalar or complex.

## Language elements and terms

### Null values

See [null, NULL, Null - Microsoft Style Guide][06].

Use lowercase _null_ to refer to a null value. Better yet, use _null value_ to avoid confusion with
the constant.

Use `$null`, `NULL`, or `Null` (depending on the language context) only to refer to the constant.
Use `DBNull` to refer to the `[System.DBNull]` type.

### Boolean values

It's preferred to use `$true` and `$false` (all lowercase) when referring to the boolean values.
Alternatively, you can ise _FALSE_ or _TRUE_ (all uppercase) to refer to boolean values in general
writing. Showing boolean values in output should always match the output. For example:

```powershell
PS> $true
True
```

### Hash tables

- Use _hash table_ (two words, all lowercase) to refer to the computer science concept in general
writing. See [Hash table - Wikipedia][09].
- Use _hashtable_ (all lowercase) when referring to the PowerShell objects of type `[hashtable]`.
May be capitalized as _Hashtable_ when it begins a sentence.
Comment on lines +205 to +206
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Based on this, does about_Hash_Tables need to be renamed to about_Hashtables?

Copy link
Collaborator Author

@sdwheeler sdwheeler Jan 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Technically, yes. But practically, no. Update-Help doesn't have a way to rename files. If you have help already installed you end up with both files. So we can't really rename about_ files.

- `[hashtable]` (with backticks) when referring to the type more specifically.
- Full type names should match the .NET definition: `[System.Collections.Hashtable]`

### Statements and script blocks

A _script block_ is a generic description we have used historically, but can be a source of
confusion. Use the following terminology instead:

- A _statement block_ refers to `{}` expressions in a statement. This is how the AST refers to
them. Statement blocks don't take parameters or create new scopes.
- _scriptblock_ should be used to refer to `{}` expressions of type `[scriptblock]`. For example,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to above. about_Script_Blocks will need to be renamed to about_Scriptblocks.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same answer

the **FilterScript** parameter of `Where-Object` expects a scriptblock. Scriptblocks can take
parameters and create new scopes.

### `$_` vs. `$PSItem`

`$_` and `$PSItem` are automatic variables that refer to the current object in the pipeline.
Technically, neither variable is an alias. Both variables contain the same value.

`$PSItem` was added to PowerShell later in an attempt to provide a clearer purpose to the name.
However in practice, the _dollar underscore_ form `$_` is most commonly used.

`$_` is the preferred usage.

<!-- link references -->
[01]: https://learn.microsoft.com/en-us/style-guide/punctuation/
[02]: https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_language_keywords
[03]: https://learn.microsoft.com/powershell/scripting/community/contributing/powershell-style-guide
[04]: https://learn.microsoft.com/powershell/scripting/lang-spec/chapter-15#b16-variables
[05]: https://learn.microsoft.com/product-style-guide-msft-internal/welcome/
[06]: https://learn.microsoft.com/style-guide/a-z-word-list-term-collections/n/null
[07]: https://learn.microsoft.com/style-guide/capitalization
[08]: https://learn.microsoft.com/style-guide/punctuation/dashes-hyphens/hyphens
[09]: https://wikipedia.org/wiki/Hash_table
[10]: https://wikipedia.org/wiki/Scalar_processor#Scalar_data_type