Automatische Variablen in PowerShell
In PowerShell gibt es automatische Variablen, welche direkt von PS gefüllt und verwaltet werden. Wichtig ist auch zu wissen, dass diese System-Variablen Read-Only sind. Das bedeutet, dass diese in einem Script nur gelesen, allerdings nicht verändert oder überschrieben werden können.
Variablen mit Get-Variable auflisten
Die vordefinierten automatischen Variablen in PowerShell können mit dem Cmdlet Get-Variable ausgelesen werden:
Get-Variable
$$
Die Variable $$
enthält das letzte Token in der letzten von der Sitzung empfangenen Zeile.
$?
$?
beinhaltet den Ausführung-Status des letzten Befehls. Gibt TRUE zurück, wenn der letzte Befehl erfolgreich ausgeführt wurde. FALSE, falls der Befehl gescheitert ist.
function Test-WriteError { Write-Error "Bad" $? # $false } Test-WriteError $? # $true
In diesem Beispiel wird beim Ersten mal Aufrufen von $? FALSE ausgegeben, da noch nichts ausgeführt wurde und PowerShell deswegen von einem Fehler ausgeht. Beim zweiten Mal wird TRUE ausgegeben, da die Funktion erfolgreich aufgerufen wurde.
$^
Wird die PowerShell Variable $^ aufgerufen, so enthält diese das erste Token in der letzten Zeile, die von der Sitzung empfangen wurde.
$_
Die Variable $_ ist gleichzustellen mit $PSItem. Diese beinhalten immer das letzte (aktuelle) Objekt. Ein Beispiel wäre folgender PowerShell Code:
1,2,3 | foreach { write-host $_ } # ALTERNATIV 1,2,3 | foreach { write-host $PSItem }
$args
Die Variable $args enthält ein Array der nicht deklarierten Parameter und / oder der Parameter-Werte, die an eine Funktion oder an ein Skript übergeben werden. In Funktionen können diese Parameter in Powershell mit “param” definiert werden.
$ConsoleFileName
$ConsoleFileName enthält den Pfad zur Konsolen-Datei (.psc1), die in der Sitzung zuletzt verwendet wurde. Diese Variable wird gefüllt, wenn
PowerShell mit dem PSConsoleFile-Parameter gestartet wird.
$Error
$Error beinhaltet ein Array der zuletzt aufgetretenen Fehler. Da es sich um ein Array in PowerShell handelt, wird der letzte Fehler mit $Error[0]
aufgerufen.
Möchte man, dass ein Fehler nicht zu dieser $Error Variable hinzugefügt wird, so muss die ErrorAction auf Ignore gesetzt werden.
$Event
$Event beinhaltet ein PSEventArgs-Objekt, welches das zu verarbeitende Ereignis darstellt. Die Werte sind gleich des Cmdlets Get-Event
.
$EventArgs
$EventArgs beinhaltet ein Objekt, welches den ersten Parameter beinhaltet, welcher abgearbeitet wird.
$EventSubscriber
Enthält ein PSEventSubscriber-Objekt, welches den Ereignis-Abonnenten des zu verarbeitenden Ereignisses darstellt.
$ExecutionContext
$ExecutionContext Variable beinhaltet ein EngineIntrinsics-Objekt, welches den Ausführungskontext des Windows PowerShell-Hosts darstellt. Mit dieser Variable kann man die Ausführungsobjekte suchen, die für diese Cmdlets verfügbar sind.
$false
$false beinhaltet lediglich FALSE. Mit dieser Variable lässt sich in PowerShell Befehlen oder Scripten der String “false” darstellen. Auch im Zusammenspiel mit Operatoren wird diese oft verwendet.
$foreach
$foreach enthält lediglich den Enumerator, aber nicht die Werte einer ForEach-Schleife. Die Variable $foreach existiert nur solange die ForEach-Schleife aktiv ist, danach wird diese automatisch gelöscht. Mehr Infos zu Enumeratoren.
$HOME
Die Variable $HOME beinhaltet den vollen Pfad zum User-Home Ordner. Diese Variable kann in PowerShell gleichgestellt werden zu $env:homedrive, $env:homepath. Meist verweist diese auf den Benutzer-Order: C:\Users\%username%
.
$Host
Die $Host-Variable beinhaltet generelle Informationen zu Windows PowerShell. Unter anderem die PS-Version oder die Culture-Informationen wie die Sprache.
$input
$input beinhaltet den Enumerator der Eingabe, die an eine Funktion übergeben wird. Bei der Variablen “$Input” wird die Groß- und
Kleinschreibung beachtet und sie ist lediglich in Funktionen und
Skript-Blöcken verfügbar.
$IsCoreCLR
Falls die aktuelle PowerShell Session auf dem .NET Core Runtime läuft, beinhaltet die Variable $IsCoreCLR $True. Falls das nicht der Fall ist, wird $False ausgegeben.
$IsLinux
$IsLinux beinhaltet $True, wenn die aktuelle Session auf einem Linux Betriebssystem läuft. Wenn nicht, wird $False zurück gegeben.
$IsMacOS
$IsMacOS beinhaltet $True, wenn die aktuelle Session auf einem MacOS Betriebssystem läuft. Wenn nicht, wird $False zurück gegeben.
$IsWindows
$IsWindows beinhaltet $True, wenn die aktuelle Session auf einem Windows Betriebssystem läuft. Wenn nicht, wird $False zurück gegeben.
$LastExitCode
Die PS Variable $LastExitCode gibt den letzten Exit Code zurück, welcher von einer Windows-Software zurückgeliefert wurde.
$Matches
Die Variable $matches funktioniert mit den Operatoren -match und -notmacht. Diese beiden Operatoren liefern einen boolischen Wert zurück, welcher in $matches gespeichert wird.
$MyInvocation
$MyInvocation als Variable beinhaltet Informationen zu einem Befehl. Unter anderem ist gelistet, welchen Namen, Parameter des Befehls und Informationen zum Aufrauf des Befehls.
Im Gegensatz zu $PSScriptRoot und $PSCommandPath beinhaltet $MyInvocation Informationen über den Aufrufer oder aufrufendes Script.
$NestedPromptLevel
$NestedPromtLevel zeigt den aktuellen Level der Eingabe-Aufforderung an. Der Wert 0 ist der Standard-Promt-Level.
$null
$NULL ist eine automatische Variable, die einfach…NICHTS beinhaltet. Diese wird meist für Vergleiche in IF-Abfragen verwendet. Genaue Erklärung in einem extra Post: Unterschied $NULL und “”.
$PID
Die Variable $PID beinhaltet die Prozess-ID (Identifier), welcher die aktuelle PowerShell Session hostet.
$PROFILE
In der Variable $PROFILE verbirgt sich der Pfad zum PowerShell Profil des aktuellen Benutzers. Dies ist das Standard-Verzeichnis:
C:\Users\%username%\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1
Warum ist das interessant? Falls man spezielle Einstellungen hinterlegt hat, kann man so die Settings von einem User zum Anderen kopieren.
$PSBoundParameters
Mit $PSBoundParameters können alle derzeit genutzten Parameter und dessen Werte angezeigt werden. Diese Variable kann nur in einem Script oder einer Funktion verwendet werden.
function Test { param($a, $b) # display the parameters $PSBoundParameters }
$PSCmdlet
$PSCmdlet beinhaltet ein Objekt, welches das derzeit ausgeführte CmdLet darstellt.
$PSCommandPath
Die Var $PSCommandPath gibt den vollen Pfad inklusive den Namen des PowerShell Scripts aus.
$PSCulture
Seit PowerShell 7 gibt die Variable $PSCulture die Kultur-Informationen der aktuellen Session aus. Get-Culture gibt die Sprach-Informationen des Computers aus, aber nicht der der aktuellen Session.
$PSDebugContext
$PSDebugContext erhält während des Debuggens des Codes Informationen zur Debugumgebung. Andernfalls enthält sie einen $NULL-Wert.
$PSHOME
$PSHOME beinhaltet den Pfad zur lokalen PowerShell Installation des Windows Betriebssystems. In der Regel:
$env:windir\System32\PowerShell\v1.0
$PSItem
Die Variable $PSItem ist gleichzustellen mit $_. Diese beinhalten immer das letzte (aktuelle) Objekt. Ein Beispiel wäre folgender PowerShell Code:
1,2,3 | foreach { write-host $_ } # ALTERNATIV 1,2,3 | foreach { write-host $PSItem }
$PSScriptRoot
$PSScriptRoot beinhaltet den Pfad, in dem das aktuelle PowerShell Script gespeichert ist. Mehr Informationen in einem extra Post: $PSScriptRoot.
$PSSenderInfo
$PSSenderInfo enthält Informationen über den Benutzer, welcher die PowerShell Session startet, inklusive Zeit-Zone und Computer.
$PSUICulture
$PSUICulture beinhaltet die Sprachinformationen des aktuellen Benutzers, nicht des Computers. Diese können unterschiedlich sein. Beispielsweise ein Englisches Windows, aber der User nutzt eine Deutsche Oberfläche.
$PSVersionTable
$PSVersionTable beinhaltet Deails über die PowerShell Version, welche in der derzeitigen Session läuft. Außerdem sind in dieser allgemeinen Variable noch folgende Werte hinterlegt:
- PowerShell Version-Nummer
- PowerShell Edition
- GIT Commit ID
- Betriebssystem
- Plattform
- Kompatible PowerShell Versionen
- PowerShell Remote Management Protokoll Version
- WS-Management stack Version
$PWD
$PWD beinhaltet ein Pfad-Objekt, welches den vollen Pfad des derzeitigen Verzeichnisses darstellt.
$Sender
Die Variable $sender beinhaltet ein Objekt, welches derzeit ausgeführt wird. Die Informationen können auch mit Get-Event
abgefragt werden.
$ShellId
$ShellID gibt die ID (Identifier) der aktuellen Shell zurück.
$StackTrace
$StackTrace beinhaltet die Stack-Informationen der kürzlich aufgetretenen Fehler.
$switch
Die $switch Variable enthält den Enumerator eines Switch-Statements. Demzufolge ist diese nur verfügbar, solange ein switch-Anweisung ausgeführt wird.
$this
In einem Skript-Block zum Definieren einer Eigenschaft oder einer Methode verweist die Variable $This auf das erweiterte Objekt.
$true
$true beinhaltet lediglich TRUE. Mit dieser Variable lässt sich in PowerShell Befehlen oder Scripte der String “true” darstellen. Auch im Zusammenspiel mit Operatoren wird diese oft verwendet.