Powershell is in staat om opdrachten en scripts in twee verschillende modes te parsen: command mode en expression mode. Expression mode is vergelijkbaar met de meeste high-level programmeertalen, waarbij getallen beschouwd worden als numerieke gegevens en strings tussen quotes geplaatst moeten worden. Expressions zien er als volgt uit:
PS> 2+2
4
PS> "Hello " + "world"
Hello world
PS> $a = "hi"
PS> $a.length
2
In command mode is het niet nodig strings tussen aanhalingstekens te plaatsen, maar worden enkel variabelen - voorafgegaan door een $-teken - en tekst tussen haakjes niet als string beschouwd. Enkele voorbeelden hiervan zijn:
PS> copy bron.txt doel.txt
PS> write-host 2+2
2+2
PS> copy $src $dest
Dit biedt als belangrijk voordeel dat het mogelijk is heel wat typwerk te sparen wanneer men in command mode werkt. Er schuilen echter ook gevaren in deze modus, vooral wanneer men met Boolean-variabelen werkt. Het toekennen van een willekeurige string zal, zoals ervaren programmeurs weten, immers resulteren in de waarde 'True', zelfs als deze string de tekst 'False' bevat. Men is dus verplicht gebruik te maken van de variabelen $True en $False. In welke parsing mode gewerkt wordt, wordt bepaald door het eerste teken van de opdracht. Wanneer de lijn begint met een getal, een variabele of een string tussen dubbele aanhalingstekens, wordt expression mode gebruikt. Command mode wordt ingeschakeld als het eerste teken een ampersand (&), een punt gevolgd door een spatie, of een ander karakter is.
Expressie | Evaluatie | Parsing mode |
---|---|---|
2+2 | Begint met een getal | Expression mode |
"Hello World" | Begint met een string tussen dubbele quotes | Expression mode |
Hello World | Begint met een letter | Command mode |
& "Hello World" | Begint met een ampersand | Command mode |
. "script.ps1" | Begint met een punt gevolgd door een spatie | Command mode |
.123 | Begint met een punt gevolgd door een getal | Expression mode |
.HelloWorld | De punt is onderdeel van de naam '.HelloWorld' | Command mode |

Niet alleen de commando's en de te verwerken gegevens worden als objecten behandeld, maar ook de zogenaamde 'data storage'. In de meeste gevallen zullen de gegevens waarmee gewerkt wordt op de harde schijf bewaard worden en zal er dus een bestandssysteem aan te pas komen. Het principe van hiërarchische opslag, waarbij directories op hun beurt zowel andere directories als bestanden kunnen bevatten, is algemeen bekend en is zo handig gebleken dat in *nix-systemen zelfs virtuele directories als /proc en /dev in het leven geroepen werden. Om zo hardware op een generieke manier aan te kunnen spreken, net zoals directory's en bestanden aangesproken kunnen worden. Dit fenomeen is ook terug te vinden in Powershell, met name in de providers.
Voor elke denkbare hiërarchische opslagmogelijkheid kan een provider geschreven worden die deze locatie toegankelijk maakt. Met een aantal standaardcommando's of Cmdlets kan met deze providers gecommuniceerd worden, zonder dat specifieke kennis van het onderliggende opslagsysteem benodigd is. Gegevens in het Windows-register zijn bijvoorbeeld eenvoudig toegankelijk via een provider die 'Subkeys' voorstelt als directories en waarbij de combinatie van een sleutel en zijn waarde voorgesteld wordt als eigenschap of property van de Subkey.
PS> dir HKCU:
Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER
SKC VC Name Property
--- -- ---- --------
2 0 AppEvents {}
0 31 Console {ColorTable00, ColorTable01, ColorTab...
26 1 Control Panel {Opened}
0 3 Environment {TEMP, TMP, ULTRAMON_LANGDIR}
1 6 Identities {Identity Ordinal, Migrated5, Last Us...
4 0 Keyboard Layout {}
1 0 Network {}
4 1 Printers {DeviceOld}
61 1 Software {(default)}
0 0 UNICODE Program Groups {}
2 0 Windows 3.1 Migration Status {}
0 1 SessionInformation {ProgramCount}
0 7 Volatile Environment {LOGONSERVER, CLIENTNAME, SESSIONNAME...