Private/Wissen/B_Basic/B42_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

# ! Variable erstellen:

$planet = 'Erde'
New-Variable -Name $planet -Value 'Mars' -Force # ! FALSCH
New-Variable -Name  planet -Value 'Mars' -Force # * RICHTIG
Get-Process -FileVersionInfo -ErrorAction 'SilentlyContinue' -ErrorVariable 'DieSummeAllerFehlerDieGetProcessErmitteltHat'
$DieSummeAllerFehlerDieGetProcessErmitteltHat

# ! 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:

Get-Member -InputObject $objekt1
Get-Member -InputObject $objekt2
$objekt1 | Get-Member
$objekt2 | Get-Member # ! ACHTUNG: richtet sich immer an Array-Elemente
10, "Köln!" | Get-Member

(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 = 'C:\temp'

# Datei als Variable-Speicher:
${c:\temp\JetztIst.txt} = Get-Date
${c:\temp\JetztIst.txt}
# ! Nur mit primitiven/atomaren Typen nutzen (int, bool, string, datetime, etc.):
${c:\temp\JetztIst.txt} = Get-Process

# Siehe auch B13_Handout-Termini-und-TOP10.md

# ! 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://attilakrick.com/schlagwort/powershell-objekte/