PowerShell with a Purpose Blog

What's [With] {All} (the) Punctuation in PowerShell?

One of the common complaints I'm hearing these days is about the complexity of PowerShell's punctuation scheme. Ignoring the help files for a moment (they have their own syntax rules), I can see exactly where folks are coming from. The profusion of picky punctuation can be prickly indeed. So here's a primer.

Square brackets are used for two things. First, to set off object types. For example, when you define a variable, you can specify that it be of a certain type:

[string]$var = "Howdy"

Other valid types include [int], [boolean], [float], [xml], and many more; you can also include most valid .NET Framework types.

Second, square brackets are used to access specific objects in a collection through their ordinal number. Try running these commands:

$services = Get-Service

Curly braces (someone in class last week called them "pigtails," which is adorable) are used to set off blocks of code, which are - oddly enough - called "script blocks" or "scriptblocks." You'll see these used as part of a scripting construct:

if ($something -eq $else) {
 # this is a script block

But you can also see them as part of a cmdlet:

Invoke-Command -scriptblock { Dir } -computername server-r2

And you even use them as part of filtering:

Get-Service | Where { $_.Status -eq "Running" }

These are used the same way you did in Algebra class: To group expressions' priority or precedence. Here's a simple math example:

(5 + 5) * 2

Which results in 20; without the parentheses:

5 + 5 * 2

The result would be 15 (5*2 is done first, then 5+10). So very different results with the parentheses. They can also be used to group logical expressions:

($this -eq $that) -or ($those -gt $them)

Finally, they can also be used to execute "sub-commands" or "sub-pipelines," returning the results of an entire command or pipeline, and enabling that result to be passed to a parameter:

Get-WmiObject Win32_BIOS -computername (get-content names.txt)

A single period can be used in two ways. First, it signals that you want to access a property or method of an object:


When by itself at the beginning of a command line, it indicates a "dot sourcing," meaning you are loading another script into the current scope:

. c:\scripts\library.ps1

Two periods together is the range operator, which produces a set of sequential objects in the range specified:

1..10 | ForEach { Write $_ }

Hopefully, these can serve as a useful "cheat sheet" for your future PowerShell work!

Want more PowerShell articles, along with FAQs and more? Visit http://windowsitpro.com/go/DonJonesPowerShell.
Hide comments


  • Allowed HTML tags: <em> <strong> <blockquote> <br> <p>

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.