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 |