Private/Wissen/B_Basic/B3_Parsing.ps1

<#
 
# Parsing
 
Da die PowerShell ein Kommandozeileninterpreter ist werden Befehle zu erst geparst und die entstanden Token analysiert und interpretiert.
 
- **Hashtags** Parsing Kommandozeileninterpreter VSCode
 
- **Version** 2020.5.22
 
#>


# ! Ein PowerShell Kommando wird beim parsen in Token aufgeteilt und analysiert. Diese Tokens werden mit einem SPACE getrennt, z.B.:

  Write-Output -InputObject 'Buch' 
# S S => 1. nach [SPACE] splitten
# TTTTTTTTTTTT TTTTTTTTTTTT TTTTTT => 2. Token analysieren:
# Cmdlet Parameter Argument => 3. Interpretieren / Ausführen

# ! PROBLEM:
Get-ChildItem -Path C:\Database Backups
# ! ^
# ! TTTTTTTTTTT TTTTTTT => Zwei Token!
# ! LÖSUNG:
Get-ChildItem -Path 'C:\Database Backups'

# ! Token werden wie folgt analysiert:

# Example Mode Result
# ------------------ ---------- ----------------
2+2                 # Expression 4 (integer)
Write-Output 2+2    # Argument "2+2" (string)
Write-Output (2+2)  # Expression 4 (integer)
$a = 2+2            # Expression $a = 4 (integer)
Write-Output $a     # Expression 4 (integer)
Write-Output $a/2   # Argument "4/2" (string)
Write-Output ($a/2) # Argument 2 (integer)
Write-Output !1     # Argument "!1" (string)
Write-Output (!1)   # expression False (Boolean)

#! Parsing-Problem:
icacls X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
#! Lösung 1:
icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F   
#! Lösung 2: Stop das parsing nach --% =>
icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F

# ! Nach einer Pipeline können Zeilenumbrüche (CRLF) eingefügt werden, um die **Lesbarkeit** zu erhöhen:

Get-Process |
    Where-Object -Property 'Company' -ILike -Value 'Microsoft*' |
    Sort-Object -Property 'Name' |
    Select-Object -Property 'Name', 'Company' |
    Out-File -FilePath 'C:\temp\Process.txt' -Force

# TIPP ACHTUNG - Ab jetzt muss der auszuführende Block selektiert und erst dann mit F8 zur Ausführung gebracht werden. Das ständige Markieren könnte auf die Dauer ein Handling-Nachteil sein. Dieser Nachteil kann über ALT+Z in VSCode relativiert werden, da zwischen einem visuellen Umbruch gewechselt werden kann:

Get-Process | Where-Object  -Property 'Company' -ILike -Value 'Microsoft*' | Sort-Object   -Property 'Name' | Select-Object -Property 'Name', 'Company' | Out-File -FilePath 'C:\temp\Process.txt' -Force

<# ## TIPP Dieser 'visuellen Umbruch' kann in den VSCode-Einstellungen an die eigenen Bedürfnisse angepasst werden:
```json
{
    "editor.rulers": [
        { "column" : 80 , "color" : "#2c2c2c" },
        { "column" : 160 , "color" : "#ff0000" },
    ],
    "editor.wordWrap" : "wordWrapColumn",
    "editor.wordWrapColumn" : 80,
    "editor.wrappingIndent" : "indent",
}
```
#>


# ! Weitere wichtige Schreibweisen:

# Kommentarzeile:

Get-Date # Ab dem Zeichen # ist der rest der Zeile als Kommentar zu behandeln

# Kommentarblock:

<#
Sämtlicher Text zwischen diesen Zeichen wird
als Kommentar behandelt.
#>


# Region um Code-Blöcke zu gruppieren. Ein verschachteln ist möglich. Sämtliche Regionen können mittels [CTRL]+[K]+[0] in VSCode eingeklappt werden:

#region Das Aktuelle Datum
Get-Date
#endregion

# Escape characters, Delimiters and Quotes (http://ss64.com/ps/syntax-esc.html):

# TIPP - Sonderzeichen in der PowerShell:
Get-Help -Name 'about_Special_Characters' -ShowWindow

"Hallo `n Köln!"
"Hallo `r`n Köln!"
"Hallo `t Köln!"

# Boolean (Wahr/Falsch):

$true
$false

# Integer:

10

# Double:

10.5

# String ohne/mit Variablen-Auflösung:

'PowerShell-Kultur $PSCulture'
"PowerShell-Kultur $PSCulture"

# Array (Das Komma "," ist der Array-Elemente-Trenner):

'Köln' , 'München' , 'Berlin' , 'Stuttgart'         

# Das 3. Array-Element [ ]:

('Köln', 'München', 'Berlin', 'Stuttgart')[2]

# Ausdruck-Auswerten () zzgl. Eigenschaft/Methode des Objektes zurück geben:

(Test-NetConnection 192.168.50.10).PingSucceeded
(Get-Process -Name notepad).Kill()

# Abschluss einer Befehlskette mit ;

Get-Process ; Get-Service

 # Konvertierung eines String-Objektes in ein DateTime-Objekt([T]O):

 [datetime]'2016-12-31'

# Eine statische Methode eines Typen aufrufen ([T]::SM):

[DateTime]::Today

# ! Call-Operator . und &:

Set-Location -Path 'C:\Temp'
'$nachricht = "Message from Test.ps1"' | Set-Content -Path '.\Test.ps1' -Force

$nachricht = 'Keine Nachricht!'
. '.\Test.ps1' # ! Aufruf im aktuellen Gültigkeitsbereich
"Die akt. Nachricht lautet: $nachricht"

$nachricht = 'Keine Nachricht!'
& '.\Test.ps1' # ! Aufruf im eigenen Gültigkeitsbereich
"Die akt. Nachricht lautet: $nachricht"

# TODO QUIZ - https://forms.office.com/Pages/ResponsePage.aspx?id=DQSIkWdsW0yxEjajBLZtrQAAAAAAAAAAAAa__Yp1xwFUMVNZMVFTQzVZODJWMk9NWTVMMjQwWktRNC4u