Automatische Variablen in PowerShell

Written By Johannes Huber  |  Coding, PowerShell  |  0 Comments

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
Get-Variable PowerShell

$$

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.

{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}
>