Wissen/B10_Operatoren.ps1

# ? TITEL Operatoren
# ? DESCRIPTION Die Operatoren der PowerShell
# ? TAGS Operator Arithmetic Assignment Logical Comparison Type Split Join
# ? VERSION 2019.10.11.0800

# ! Die Operatoren beginnen i.d.R. mit einem Bindestrich '-' oder sind
# ! besondere alleinstehende Zeichen wie . + - & etc.
# ! Die Bindestrich-Operatoren dürfen nicht mit Parametern verwechselt werden:
# ! Where-Object 1 -EQ 1 => -EQ ist ein SwitchParameter
# ! 1 -eq 1 => -eq ist ein Vergleichs-Operator

# TODO Weiterführende und Nachschlage-Informationen
Get-Help -Name about_Operators            -ShowWindow # Übersicht aller Operatoren
Get-Help -Name about_Operator_Precedence  -ShowWindow # Vorrangregeln
Get-Help -Name about_Arithmetic_Operators -ShowWindow # Arithmetische- Operatoren
Get-Help -Name about_Assignment_Operators -ShowWindow # Zuweisungs- Operatoren
Get-Help -Name about_Logical_Operators    -ShowWindow # Logische- Operatoren
Get-Help -Name about_Comparison_Operators -ShowWindow # Vergleichs- Operatoren
Get-Help -Name about_Type_Operators       -ShowWindow # Typen- Operatoren
Get-Help -Name about_Split                -ShowWindow # String-Zerlege- Operatoren
Get-Help -Name about_Join                 -ShowWindow # String-Zusammenfüge-Operatoren

#region about_Arithmetic_Operators

Get-Help -Name about_Arithmetic_Operators -ShowWindow

1 + 1
9 - 1
-10
2 * 10
10 / 2
9 % 2
15 -shl 1
15 -shr 1

#endregion

#region about_Assignment_Operators

Get-Help -Name about_Assignment_Operators -ShowWindow

$zahl=1   # Start: 1
$zahl++   # $zahl = $zahl + 1
$zahl--   # $zahl = $zahl - 1
$zahl+=2  # $zahl = $zahl + 2
$zahl-=3  # $zahl = $zahl - 3
$zahl++   # $zahl = $zahl + 1
$zahl     # Ergebnis: ???
$zahl=-10
$zahl     # Ergebnis: ???

$varA = (Get-Process)[0]
$varA += (Get-Process)[1] # ! FEHLER Process-Objekte können nicht addiert werden
# vs.
$varB = @()               # Erzeugt ein leeres Array ...
$varB += (Get-Process)[0] # ... und fügt diesem ein Process-Objekt hinzu.
$varB += (Get-Process)[1] # ... und fügt diesem ein Process-Objekt hinzu.
# ! ACHTUNG ARRAYS KÖNNEN NICHT ERWEITERT WERDEN !
$varC = @()
Measure-Command { 1..2000 | ForEach-Object {$varC += "Objekt $_"} } | Select-Object TotalSeconds
$varC.Length
$varC[500]
# ! VS.
$varD = New-Object -TypeName System.Collections.ArrayList
Measure-Command { 1..20000 | ForEach-Object {$varD.Add("Objekt $_") | Out-Null} } | Select-Object TotalSeconds
$varD.Count
$varD[500]
$varE = $varD.ToArray()
$varE

#endregion

#region about_Logical_Operators

Get-Help -Name about_Logical_Operators -ShowWindow

$true -and $true
$true -or  $false
($true -and $true) -or ($true -or $false)

(1 -eq 1) -or  (1 -eq 2) 
(1 -eq 1) -xor (2 -eq 2)

!$true -and $true
-not $true -and $true

#endregion

#region about_Comparison_Operators

Get-Help -Name about_Comparison_Operators -ShowWindow

"Köln"                       -eq       "köln"
"Köln"                       -ceq      "köln"
"Köln"                       -ieq      "köln" # ieq IST ceq MIT eq
"Köln", "Hamburg", "München" -ceq      "Köln"
"Köln"                       -cin      "Köln", "Hamburg", "München"
"Köln", "Hamburg", "München" -contains "Köln"

# ! ACHTUNG
"010" -eq  010   # FALSE
 010  -eq "010"  # TRUE

# ? -like
"abc" -like "?b?" # *, ?, ...
"abc@abc.de" -like "*@*.*"
"abc@@@@abc.de" -like "*@*.*" # ! PROBLEM, Lösung -match

# ? -match (Reguläre Ausdrücke, kurz "regex", Wikipedia)

# siehe u.a. https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck
<#
    REGEX = TARGET
    a = a
    [abc] = a b c
    [a-z] = a b c d e f g ...
    [a-züöä] = a b c d ä ö z ...
    a{2,5} = aa aaa aaaa aaaaa
    . = Alle Zeichen außer Zeilenumbrüche
    \ = Maskieren [\.\\]
    ^ = Vom ersten Zeichen
    $ = Bis zum letzten Zeichen
    + = {1,}
    * = {0,}
#>


"AB678.docx" -match "^[A-Z]{2,2}[0-9]{3,3}\.doc[x]{0,1}$" # True
"AB678.doc"  -match "^[A-Z]{2,2}[0-9]{3,3}\.doc[x]{0,1}$" # True
"XX678.doc"  -match "^[A-Z]{2,2}[0-9]{3,3}\.doc[x]{0,1}$" # True
"XX123.docx" -match "^[A-Z]{2,2}[0-9]{3,3}\.doc[x]{0,1}$" # True
"X123.docx"  -match "^[A-Z]{2,2}[0-9]{3,3}\.doc[x]{0,1}$" # False
"AA1.docx"   -match "^[A-Z]{2,2}[0-9]{3,3}\.doc[x]{0,1}$" # False
"AA123.xlsx" -match "^[A-Z]{2,2}[0-9]{3,3}\.doc[x]{0,1}$" # False

"a.krick@gfu.net" -match "^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"

# ? Array-Vergleich
10,11,12,13,14,10 -eq 10
10,11,12,13,14,10 -ne 10
10,11,12,13,14,10 -gt 10

10          -in       10,11,12,13
10,11,12,13 -contains 10

# ? Vergleichsoperatoren z.B. nutzen in: Where-Object, if(){}

100 -eq 99 # Als Ausdruck

if(10 -gt 5) # In if
{
    # Code
}

Get-Process | Where-Object -Property Name -EQ -Value Code # Im Where-Object

#endregion

#region about_Type_Operators

Get-Help -Name about_Type_Operators -ShowWindow 

(Get-Process)[0] -is [System.Diagnostics.Process] # Ist ein Objekt von einem bestimmten Typen
(Get-Process)    -is [System.Array]

          "2015-03-18" -is [DateTime]
[DateTime]"2015-03-18" -is [DateTime]

"2015-03-18" -as [DateTime]

"2015-03-18".PSTypeNames

"2015-03-18".GetType()
(Get-Process)[0].GetType()

#endregion

#region -f (Format-Operator) s. about_operators

Get-Help -Name about_Operators -ShowWindow

# "FORMAT" -f Value[s]

"Wert 1 ist {0}, der letzte Wert ist {3} und die anderen sind: {1}, {2}" -f 10,11,99,230,1024

$zahlen = 10,11,99,230,1024
"Wert 1 ist $($zahlen[0]), der letzte Wert ist $($zahlen[3]) und die anderen sind: $($zahlen[1]), $($zahlen[2])"

"Zahlenformat: {0}"          -f 123456.6789
"Zahlenformat: {0:#,##}"     -f 123456.6789
"Zahlenformat: {0:0.0}"      -f 123456.6789
"Zahlenformat: {0:#,##0.00}" -f 123456.6789
"Zahlenformat: {0:c2}"       -f 123456.6789

"Heute ist {0}"                                                                       -f (Get-Date)
"Heute ist {0} und wir haben {1} Uhr"                                                 -f (Get-Date), (Get-Date)
"Heute ist {0} und wir haben {0} Uhr"                                                 -f (Get-Date)
"Heute ist {0:dd.MM.yyyy} und wir haben {0:HH:mm} Uhr"                                -f (Get-Date)
"Heute ist {0:dddd.} der {0:d. MMMM} anno {0:yyyy HH:mm} und {0:ss.fffffff} Sekunden" -f (Get-Date)
"Heute ist {0:yyyy yy MMMM MMM MM M dddd ddd dd d HH hh mm ss fffffff}"               -f (Get-Date)                                                                       -f (Get-Date)

# ! ACHTUNG das Rückgabeobjekt ist IMMER ein String

"{0,-10:0.0} | {1,-10:0.0} | {2,-10:0.0}" -f   "Wert A", "Wert B", "Sum"
"{0, 10:0.0} | {1, 10:0.0} | {2, 10:0.0}" -f   12,  23, 167.889
"{0, 10:0.0} | {1, 10:0.0} | {2, 10:0.0}" -f  212, 123,  67.89
"{0, 10:0.0} | {1, 10:0.0} | {2, 10:0.0}" -f 3319,   3,   7.8

#
# Beispiele
#

$pcs = (1..100 | ForEach-Object -Process {"PC{0:000}" -f $_})
$session = New-PSSession -ComputerName $pcs
Invoke-Command -Session $session -ScriptBlock {Restart-Computer}

"Log_{0:yyyyMMddHH}.log" -f (Get-date)

#endregion

#region about_Split

Get-Help -Name about_Split -ShowWindow

$result = "ADS001;127.0.0.1;1234.67;" -split ";"
$result[1]

$env:PSModulePath -split ";"

#endregion

#region about_Join

Get-Help -Name about_Join -ShowWindow

$result = "Hallo Köln!", "127.0.0.1", 123.45
$result -join ";"

#endregion

#region replace

Get-Help -Name about_Comparison_Operators -ShowWindow

"Hallo Köln!" -iReplace "Köln", "Berlin"

#endregion

#region Spezial-Operator

Get-Help -Name about_Operators -ShowWindow

# ? &-Operator
# ! Führt einen Befehl, ein Skript oder einen Skriptblock aus.
# ! Mit dem Aufrufoperator, können Sie Befehle ausführen, die in Variablen gespeichert und
# ! durch Zeichenketten oder Skriptblöcke dargestellt sind. Der Aufrufoperator wird in
# ! einem untergeordneten Bereich ausgeführt (s. about_scopes)
$c = {Get-Service -Name Spooler}
& $c

# ? . Operator
# ! Führt ein Skript im aktuellen Bereich aus, so dass alle Funktionen, Aliase und Variablen,
# ! die das Skript erstellt, dem aktuellen Bereich hinzugefügt werden.
. c:\scripts\sample.ps1

# ? Cast-Operator
# ! Konvertiert oder begrenzt Objekte auf den angegebenen Typ.
# ! Wenn die Objekte nicht konvertiert werden können,
# ! generiert PowerShell einen Fehler.
[datetime]$birthday = "1/20/88" ; $birthday
[int64]$a = 34 ; $a

# ? .. Range-Operator
# ! Stellt die sequentiellen Ganzzahlen in einem ganzzahligen Array dar,
# ! das eine obere und untere Grenze aufweist.
1..10
10..1

# ? :: Statische-Member-Operator
# ! Ruft den Operator für statische Eigenschaften und Methoden einer .NET Framework-Klasse auf.
# ! Um die statischen Eigenschaften und Methoden eines Objekts zu finden,
# ! verwenden Sie den Static-Parameter des Cmdlets Get-Member.
[datetime]::now

#endregion