Private/Wissen/B_Basic/B14_Variablen.ps1
<#
# Variable Objektvariablen und die Verwendung in der PowerShell. - **Hashtags** Hashtable Variable decimal datetime array String ScriptBlock - **Version** 2020.06.10 #> [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '')] param() # READ Weiterführende und Nachschlage-Informationen: Get-Help -Name 'about_Variables' -ShowWindow # Grundlagen Get-Help -Name 'about_Automatic_Variables' -ShowWindow # Systemvariable Get-Command -Noun 'Variable' -Module 'Microsoft.PowerShell.Utility' # ! Der Inhalt einer Variablen bleibt über die komplette Sitzung erhalten, auch nach dem Skript-Ablauf. Der Inhalt einer Variablen kann einfacher Natur ...: $einfach = 12 # ! ...oder komplexer Natur sein: $komplex = (Get-Service)[0] # ! Gültigkeitsbereiche von Variablen: # READ Weiterführende und Nachschlage-Informationen: Get-Help -Name 'about_Scopes' -ShowWindow # Geltungsbereich # Auf Ebene der PowerShell-Anwendung: $Global:A # Auf Ebene des Scripts/Modules: $Script:B # Auf Ebene des aktuellen Gültigkeitsbereiches $Private:C # ! PowerShell-Provider für Variable: Get-ChildItem -Path Variable: -Force Get-Item -Path Variable:\PSVersionTable Set-Item -Path Variable:\PSUICulture -Value "en-US" -Force Test-Path -Path Variable:\Error # ! Variable erstellen: $planet = 'Erde' New-Variable -Name $planet -Value 'Mars' -Force # ! FALSCH New-Variable -Name planet -Value 'Mars' -Force # * RICHTIG Get-Process -FileVersionInfo -ErrorVariable 'sumErrors' -ErrorAction 'SilentlyContinue' $sumErrors # ! Prüfen ob eine Variable (PSProvider) vorhanden ist: Test-Path -Path 'variable:\planet' Test-Path -Path 'variable:\planetX' # ! ReadOnly vs. Constant: New-Variable -Name 'PI' -Value 3.14 -Option 'ReadOnly' $PI = 99 New-Variable -Name 'PI2' -Value 3.14 -Option 'Constant' $PI2 = 99 Set-Variable -Name 'PI' -Value 99 -Force Set-Variable -Name 'PI2' -Value 99 -Force # ! Eine Variable muss immer von einem Typ sein: $text = "Hallo Köln!" # System.String $zahl1 = 123 # System.Int32 $zahl2 = 123.5 # System.Double $istWahr = $true # System.Boolean $objekt1 = (Get-Process)[0] # System.Diagnostics.Process $objekt2 = Get-Process # System.Object[] # ! Den Typ der Variablen ermitteln: $objekt1.GetType() $objekt2.GetType() $objekt1 | Get-Member $objekt2 | Get-Member # ! ACHTUNG: richtet sich immer an Array-Elemente (Get-ChildItem -Path c:\ -Force) -is [System.IO.FileInfo] # False (Get-ChildItem -Path c:\ -Force) -is [System.IO.DirectoryInfo] # False (Get-ChildItem -Path c:\ -Force) -is [System.Array] # True (Get-ChildItem -Path c:\ -Force -File | Select-Object -First 1) -is [System.IO.FileInfo] # True (Get-Item -Path C:\Windows -Force) -is [System.IO.DirectoryInfo] # True # ! Typen-Umwandlung vs. Variablentyp festlegen: $b = [int]"99" # Der Typ von $b kann sich ändern [int]$c = "99" # $c wird für IMMER auf int festgelegt $b | Get-Member $c | Get-Member $b = 'Hallo Welt!' $b | Get-Member $c = 'Hallo Welt!' # ! Sonderformen von Variablen: # Windows Umgebungsvariablen: $env:WinDir # Datei als Variable-Speicher: ${c:\temp\JetztIst.txt} = Get-Date ${c:\temp\JetztIst.txt} # ! Variablen evtl. in Skripten und Funktionen aufräumen nach dem Prinzip 'Keine Spuren hinterlassen': Remove-Variable -Name 'alter' Remove-Variable -Name 'PI' -Force Remove-Variable -Name 'PI2' -Force Remove-Variable -Name '*' -Force -ErrorAction 'SilentlyContinue' # TIPP - Variablen auch gerne als Temp-Notizen nutzen: $var4 = Get-ChildItem -Path c:\ -File -Recurse -ErrorAction Ignore $var4.Length $var5 = $var4 | Where-Object Name -Like '*Microsoft*' $var5 # TIPP - Bezüglich .PS1-Script-Dateien sollten Variablen vor der ersten Verwendung IMMER deklariert werden. So fallen Tipp-Fehler immer auf: Set-StrictMode -Version 'Latest' $Password = "geheim" $Pasword -eq "geheim" Set-StrictMode -Off # TODO QUIZ - https://forms.office.com/Pages/ResponsePage.aspx?id=DQSIkWdsW0yxEjajBLZtrQAAAAAAAAAAAAa__Yp1xwFUMkJEVldTSVI3SlNDUFVBME5ENDBNMUtSSS4u |