Aangezien het vaak nuttig kan zijn resultaten van commando's tussentijds bij te houden om die wat verder in een script opnieuw te gebruiken, vormen variabelen een onmisbaar onderdeel in elke script- en programmeertaal. Tijdens het werken met de Powershell kunnen variabelen herkend worden aan de $ die de naam voorafgaat. In de uitdrukking $lengte = "Lente van de tekst".length
is $lengte dan ook de variabele waarin het resultaat van de expressie na het gelijkheidsteken opgeslagen wordt. Het is overigens niet nodig een variabele voor gebruik te definiëren. Een constructie als Dim lengte as Integer
uit VBScript is dan ook overbodig geworden. De Powershell-interpreter herkent het dollarteken automatisch en bepaalt op basis van de waarde die in de variabele opgeslagen wordt om welk type het gaat. De naam van de variabele eindigt bij het eerste zogenaamde 'word breaking character'. Dit kan een spatie, een punt of een komma zijn. Als men toch dergelijke tekens in de naam van de variabele wil gebruiken, is het mogelijk de naam tussen accolades te plaatsen.
PS> $stringVariable = "This is a string" PS> $stringVariable This is a string PS> $!@#$%^&*() = "This is a non-traditional variable name" Invalid variable reference. '$' was not followed by a valid variable name character. Consider using ${} to delimit the name. At line:1 char:1 + $ ${!@#$%^&*()} = "This is a non-traditional variable name" PS> ${!@#$%^&*()} This is a non-traditional variable name
Een aantal variabelenamen zijn echter gereserveerd door de Powershell. Het gaat daarbij onder andere om variabelen die gebruikt kunnen worden om de werking van de Powershell te controleren. In de onderstaande tabel zijn een aantal van die variabelen opgenomen.
Variabelenaam | Beschrijving |
---|---|
$^ | Bevat het eerste teken van de laatste lijn die ingevoerd werd in de shell. |
$$ | Bevat het laatste teken van de laatste lijn die ingevoerd werd in de shell. |
$_ | Het huidige object in de pipeline; kan onder andere gebruikt worden in scripts, filters, where-clausules en switch-statements. |
$? | Bevat de 'success/fail'-status van het laatst uitgevoerde statement. |
$Args | Wordt gebruikt bij het creëren van functies die parameters vereisen. |
$Error | Bevat de laatste error die gegenereerd werd tijdens het uitvoeren van een statement. |
$foreach | Verwijst naar de enumerator in een foreach-lus. |
$HOME | The homedirectorie van de gebruiker; verwijst naar %HOMEDRIVE%\%HOMEPATH%. |
$true | Boolean 'waar' |
$false | Boolean 'vals' |
$null | Een null-object. |
Types variabelen en werken met arrays
Zoals hierboven al aangegeven wordt, is het in Powershell-scripts niet nodig om variabelen te definiëren, maar wordt het variabeletype automatisch bepaald aan de hand van de gegevens die erin opgeslagen worden. Zo zal $intVar = 123
resulteren in een integer, terwijl $strVar = "Hello World"
een string tot resultaat zal hebben. De verregaande integratie van .NET heeft tot gevolg dat zowat elk type variabele uit .NET ook in Powershell bruikbaar is: array, bool, byte, char, char[], decimal, double, float, int, int[], long, long[], regex, single, scriptblock, string, type
en xml
. Omdat het in bepaalde gevallen wenselijk is zelf te kunnen bepalen welk type een bepaalde variabele zal worden, is er ook een casting-mogelijkheid ingebouwd. In de volgende twee voorbeelden wordt er bijvoorbeeld voor gekozen om de strings respectievelijk als integer en als xml-variabele te bewaren:
PS> $a=[int]"4" PS> $a=[xml]"<parentitem><childitem>Hello </childitem><childitem>World</childitem></parentitem>"
Voor het creëren van een array volstaat het de verschillende waarden in te voeren, gescheiden door een komma. Het terughalen van een specifieke waarde uit een array gebeurt met behulp van de index, waarbij de eerste waarde index 0 heeft.
PS> $array = 1, 2, 3, "test" PS> $array[3] test
Om te achterhalen welke functies en properties beschikbaar zijn bij een bepaald object of variabeletype is er het commando Get-Member
.
PS> "Dit is een string" | Get-Member TypeName: System.String Name MemberType Definition ---- ---------- ---------- Clone Method System.Object Clone() CompareTo Method System.Int32 CompareTo(Object value),... Contains Method System.Boolean Contains(String value) CopyTo Method System.Void CopyTo(Int32 sourceIndex,... EndsWith Method System.Boolean EndsWith(String value)... Equals Method System.Boolean Equals(Object obj), Sy... ...
Conditionele statements en rekenkundige operatoren
Als men een waarde opgeslagen heeft in een variabele, is het natuurlijk de bedoeling om daar wat mee te gaan doen. Vaak zal men deze waarden met elkaar willen vergelijken of er bewerkingen mee uitvoeren en ook daar is de Powershell op voorzien. Aangezien de Powershell-syntax heel wat aspecten van C# geleend heeft, zullen programmeurs zich al gauw thuisvoelen in deze omgeving.
Operator | Beschrijving |
---|---|
= | Kent de waarde van het argument toe aan de variabele. |
+= | Telt de waarde van het argument op bij de waarde van de variabele en slaat het resultaat op in de variabele. |
-= | Trekt de waarde van het argument af van d waarde van de variabele en slaat het resultaat op in de variabele. |
*= | Vermenigvuldigt de waarde van het argument met de variabele en slaat het resultaat op in de variabele. |
/= | Deelt de waarde van de variabele door het argument en slaat het resultaat op in de variabele. |
%= | Slaat de rest van de deling van de variabele door het argument op in de variabele |
Vanzelfsprekend kunnen de operatoren +, -, *, / en % ook gebruikt worden in gewone expressies als $som = 1 + 2 * 3
. Daarnaast kunnen $teller++
en $teller--
gebruikt worden om de variabele $teller respectievelijk te verhogen en te verlagen. Ook voor het vergelijken van variabelen zijn overigens een aantal operatoren voorzien. Door de letter c toe te voegen voor onderstaande operatoren, wordt de conditie hoofdlettergevoelig gemaakt, bijvoorbeeld -clt voor de hoofdlettergevoelige versie van -lt.
Operator | Beschrijving |
---|---|
-lt | Kleiner dan |
-le | Kleiner dan of gelijk aan |
-gt | Groter dan |
-ge | Groter dan of gelijk aan |
-eq | Gelijk aan |
-ne | Niet gelijk aan |
-contains | Gaat na of het argument na de operator voorkomt in het argument voor de operator |
-notcontains | Controleert of het argument na de operator niet voorkomt in het argument voor de operator |
-like | Vergelijkbaar met -eq, maar kan wildcards verwerken. |
-notlike | Vergelijkbaar met -ne, maar kan wildcards verwerken |
-match | Controleert of het argument voldoet aan een reguliere expressie |
-notmatch | Gaat na of het argument niet voldoet aan een reguliere expressie |