PowerShell 7 und Windows PowerShell. Tobias Weltner

PowerShell 7 und Windows PowerShell - Tobias Weltner


Скачать книгу
Tipp

      Welche Variablen es sonst noch gibt, verraten PowerShell-Editoren wie ISE oder VSCode bereits, wenn Sie ein $ eingeben: Dann nämlich erscheint ein Auswahlmenü mit den verfügbaren Variablennamen. In der Konsole drücken Sie image, um sich die Variablennamen vorschlagen zu lassen.

      Natürlich können Sie auch eigene Variablen festlegen. Dazu kommen wir etwas später.

       Anführungszeichen im Text

      Knifflig wird es, wenn Sie innerhalb des Texts Anführungszeichen anzeigen lassen wollen. Dann braucht man einen Weg, um diese inneren Anführungszeichen von den äußeren begrenzenden Anführungszeichen zu unterscheiden, damit PowerShell weiß, ob Sie einen Text beenden oder darin nur ein Anführungszeichen nutzen wollen. Wenn man Anführungszeichen verdoppelt, kann man sie von den begrenzenden Anführungszeichen unterscheiden:

      PS> 'Hier stehen ''Anführungszeichen''.' image

      Hier stehen 'Anführungszeichen'.

      PS> "Hier stehen ""Anführungszeichen""." image

      Hier stehen "Anführungszeichen".

      In Text, der mit doppelten Anführungszeichen begrenzt wird, steht außerdem das PowerShell-Escape-Zeichen (der Accent grave `) zur Verfügung. Mit ihm kann man das jeweils folgende Zeichen »entwerten«, also seine besondere Funktionalität »abschalten«. Ein so markiertes Anführungszeichen würde also den Text nicht beenden (sondern wörtlich als Zeichen erscheinen), und auch ein $ würde nicht länger eine Variable einleiten, sondern ebenfalls wörtlich als Text erscheinen:

      PS> "Hier stehen `"Anführungszeichen`"." image

      Hier stehen "Anführungszeichen".

      PS> "Variable `$env:username enthält den Wert: $env:username"

      Variable $env:username enthält den Wert: tobias

       Here-Strings

      Bei größeren Texten könnte es mühselig werden, alle darin vorkommenden Anführungszeichen zu entwerten oder per Verdopplung zu maskieren.

      Deshalb kennt PowerShell neben den normalen einzelnen Anführungszeichen noch weitere Textbegrenzungszeichen, die aus insgesamt drei Zeichen bestehen. Das öffnende Begrenzungszeichen besteht dabei aus den Zeichen @, Anführungszeichen (einfach oder doppelt) und Zeilenumbruch. Das schließende Begrenzungszeichen dreht die drei Zeichen um:

      @"

      Ein Text, der nun auch

      "Anführungszeichen" direkt

      enthalten darf.

      "@

      Bei PowerShell nennt man Texte, die auf diese Weise definiert werden, Here-Strings.

      Here-Strings bestehen zwar meist aus mehreren Textzeilen, aber mehrzeiligen Text könnte man auch ohne sie mit ganz normalen Anführungszeichen definieren. Man braucht sie nur, wenn man Text begrenzen möchte, in dem missverständliche Anführungszeichen vorkommen und Sie keine Lust haben, diese Anführungszeichen einzeln zu maskieren.

       Achtung

      Weil der Zeilenumbruch zum Trio der Begrenzungszeichen gehört, darf man hinter dem ersten Anführungszeichen nicht sofort den Text beginnen lassen oder einen Kommentar anfügen. Hier muss zuerst ein Zeilenumbruch folgen. Ebenso darf das abschließende Begrenzungszeichen nicht eingerückt werden, weil auch dann der Zeilenumbruch als Teil des Begrenzungszeichens verloren gehen würde.

       Zahlen

      Zahlen sind nur dann wirklich Zahlen, wenn sie nicht in Anführungszeichen stehen. Wer Zahlen in Anführungszeichen stellt, macht daraus einen Text, der nur (zufälligerweise) aussieht wie eine Zahl. Ein Text verhält sich ganz anders als eine Zahl, wie das folgende Beispiel beweist:

      # Korrekt: Zahl angeben und Berechnung durchführen:

      PS> 5.6 * 3

      16,8

      # Inkorrekt: Zahl in Text verwandelt, Text wird wiederholt:

      PS> '5.6' * 3

      5.65.65.6

      # Inkorrekt: Liste anstelle von Dezimalzahl angegeben, Liste wird wiederholt:

      PS> 5,6 * 3

      5

      6

      5

      6

      5

      6

      Und wieso piept der folgende Befehl trotzdem in 800 Hz und für 1.200 Millisekunden, obwohl die Zahlen fälschlicherweise in Anführungszeichen stehen?

      PS> [Console]::Beep('800', '1200')

      Weil PowerShell es gut mit Ihnen meint und kleinere Fehler verzeiht. Wenn PowerShell erkennt, dass die benötigte Information numerisch sein soll, wandelt es Text automatisch in Zahlen um. Empfehlenswert ist das aber nicht, denn es bedeutet doppelte Arbeit und unklare Angaben. Also: Zahlen gehören nie in Anführungszeichen, wenn Sie sie numerisch verwenden sollen!

       Datum und Zeit

      PowerShell kennt bei der Codeeingabe nur Zahlen und Text, aber keine besondere Kennzeichnung für Datum oder Zeit. Dennoch sind Datums- und Zeitangaben natürlich bei vielen Befehlen wichtig.

      PowerShell muss Datum und Zeit also immer über den Umweg der Umwandlung aus Text herstellen, und das bietet Raum für viele Missverständnisse, die mit Ländereinstellungen und folkloristischen Datumsformaten der verschiedensten Nationen dieser Welt zu tun haben.

      Was bei automatischen Umwandlungen alles schiefgehen kann, zeigt dieses Beispiel, das aus derselben Textinformation zwei völlig unterschiedliche Daten generiert:

      PS> [DateTime]'1.12.2021'

      Dienstag, 12. Januar 2021 00:00:00

      PS> '1.12.2021' -as [DateTime]

      Mittwoch, 1. Dezember 2021 00:00:00

      Umso wichtiger ist es also, Datum und Zeit immer in einem Textformat anzugeben, das weltweit und bei jeder Betriebssystemsprache eindeutig und richtig umgewandelt wird. Wo immer künftig in PowerShell Datums- oder Zeitangaben benötigt werden, geben Sie diese Information deshalb im sogenannten ISO-Format an, denn dieses Format funktioniert in allen Sprachen der Welt auf dieselbe Weise:

      yyyy-MM-dd HH:mm:ss

      jahr-monat-tag stunde(24h):minute:sekunde

      Die Beispiele zeigen, dass dieses ISO-Format in allen erdenklichen Szenarien und mit den unterschiedlichsten Spracheinstellungen immer dasselbe Ergebnis liefern:

      PS> Get-Date -Date '2021-12-01 18:30:00'

      Mittwoch, 1. Dezember 2021 18:30:00

      PS> [DateTime]'2021-12-01 18:30:00'

      Mittwoch, 1. Dezember 2021 18:30:00

      PS> '2021-12-01 18:30:00' -as [DateTime]

      Mittwoch, 1. Dezember 2021 18:30:00

Скачать книгу