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