PowerShell Loop Hands-On

Beim programmieren kommen oft Arrays und Schlaufen-(Loops) zur Anwendung, so auch beim arbeiten mit PowerShell Scripts. In folgendem Beispiel werden 4 Array Werte angelegt, diese mittels der ID wieder aufgerufen werden.

Ein Array erstellt man mit folgendem Befehl:
PS C:\>
$array = @("sandwich","salad","beer","espresso")
Write-Host $array[0,1,2,3]
Mit For-Schleife Array Werte ausgeben:

Die Länge des Arrays, bzw. die Anzahl der gespeicherten Werte, wird mit $array.length ausgelesen. Die Variable ($i) dient als Zähler, um zu Zählen wann die Schleife verlassen werden soll. Dem Zähler wird ein Startwert zugewiesen ($i=0). Der Startwert soll bei jedem Durchlauf der Schleife um 1 erhöhen ($i++) bis der Endwert erreicht ist. Der Endwert ist die Länge des Array ($array.length). Bei der Überprüfung des Endwert gibt es eine Bedingung: solange $i kleiner der Anzahl der Werte ($i -lt $array.length) ist.

For loop
for ($i=0; $i -lt $array.length; $i++){
  Write-Host $array[$i] 
}

Die For-Schleife: for ($i=0; $i -lt $array.length; $i++)
Startwert $i=0: Die Variable $i startet mit dem Wert 0
ist $i kleiner (-lt) $i -lt $array.length Bedingung: die For Schleife wird solange ausgeführt, solange diese Bedingung erfüllt ist: solange die Variable $i kleiner als $array.length ist, solange also $i kleiner 4 ist. Die Aktion beim Durchlauf der Schleife: $i++ bedeutet, den Wert der Variable $i um 1 erhöhen, bei jedem Durchlauf der Schleife wird $i um 1 grösser: 0 .. 1 .. 2 .. 3 …

while loop
$i=0
while ($i -lt $array.length){
  Write-Host $array[$i] 
  $i++
}

Beispiel mit Startwert $i vor der Schleife definiert ($i=0)
while ($i -lt $array.length){
Innerhalb von while steht die Bedingung für den Durchlauf der Schleife, der Loop wid nicht verlassen, solange diese erfüllt ist:
$i -lt $array.length … solange $i kleiner $array.length ist
Die Variable $i wird innerhalb der Schleife jeweils um den Wert 1 erhöht: $i++

Endless Loop

while kann für eine Endlosschleife wie folgt verwendet werden: mit break kann die Endlosschleife wieder verlassen werden. Folgendes Beispiel durchläuft die Schleife bis break ausgeführt wird, dies geschieht wenn $i nicht mehr kleiner dem Wert 10 ist:

$i=0
while($true) {
  $i++
  write-host $i
  if ($i -ge 10) {break}
}
do loop
$i=0
do{
  Write-Host $array[$i] 
  $i++
} while ($i -lt $array.length)
foreach
foreach ($i in $array){
  Write-Host $i 
}

foreach ($i in $array)  Aufruf aller Werte des Array ($array). Die Variable $i enthält bei jedem Durchlauf den aktuell ausgelesenen Wert.

Operators Variations:

-gt greater than
-igt greater than, case-insensitive
-cgt greater than, case-sensitive
-ge greater than or equal
-ige greater than or equal, case-insensitive
-cge greater than or equal, case-sensitive
-lt less than
-ilt less than, case-insensitive
-clt less than, case-sensitive
-le less than or equal
-ile less than or equal, case-insensitive
-cle less than or equal, case-sensitive

Linux Splash Screen mit Linuxlogo

Linuxlogo ist ein Linux-Befehlszeilenprogramm, das ein farbiges ANSI-Bild des Distributionslogos als Splash Screen mit den wichtigsten Systeminformationen erzeugt.

Linuxlogo Splash Screen im Terminal erzeugen

Hierbei bietet sich die Datei issue.net oder motd auf sinnvolle weise an, ein Splash Screen des Host auszugeben, motd steht für message of the day. Diese Dateien, welche vom Login-Prozess genutzt werden, befinden sich unter dem Konfigurationsverzeichnis /etc und geben nach einem erfolgreichem Login – aber noch vor dem Start der jeweiligen Login-Shell eine Meldung aus.

Linuxlogo Installation

# redhat CentOS
$ sudo yum -y install linux_logo
# Debian Ubuntu
$ sudo apt-get -y install linuxlogo
# Fedora
$ sudo dnf -y install linux_logo

Die Autostart Konfiguration rc.local erzeugt beim Boot-Prozess die nötigen Einträge, für den Konsole Login mit der Datei issue und den Remote Login issue.net.

$ sudo vi /etc/rc.d/rc.local
# Debian & Ubuntu
$ sudo vi /etc/rc.local
if [ -f /usr/bin/linux_logo ]; then
     echo "" > /etc/issue
     /usr/bin/linux_logo -L debian_banner -u >> /etc/issue
     echo >> /etc/issue
fi
if [ -f /usr/bin/linux_logo ]; then
     echo "" > /etc/issue.net
     /usr/bin/linux_logo -L debian_banner -a -u >> /etc/issue.net
     echo >> /etc/issue.net
fi

Der Aufruf unter Debian und Ubuntu ist wie folgt:

$ /usr/bin/linuxlogo -L debian_banner_2 -u

rc.local muss ausführbar sein.

$ sudo chmod +x /etc/rc.d/rc.local

Damit der Splash Screen bei Remote Login im SSH-Terminal erscheint, muss man den Banner des SSH Daemon aktivieren.

$ sudo vi /etc/ssh/sshd_config

Die Zeile (ca. 108) das hash (#) entfernen und issue.net hinzufügen.

# no default banner path
Banner /etc/issue.net

Die Änderung wird wirksam mit neustart des SSH Daemon.

# CentOS 7
$ sudo systemctl restart sshd
# CentOS 6
$ sudo service sshd restart

Wo aus rechtlichen Gründen ein Hinweis vor unautorisiertem Zugriff zur Konsole warnen soll, kann die Datei /etc/motd folgende Ausgabe erzeugen:

$ sudo vi /etc/motd
##############################################################################
#             Unauthorized access to this system is prohibited !             #
#                                  ******                                    #
#    This system is actively monitored and all connections may be logged.    #
#         By accessing this system, you consent to this monitoring.          #
##############################################################################

Auch bietet sich an, den Splash Screen mit Linux Logo aus der ~/.bashrc auszugeben, hier ein Beispiel für die Systemweite bash Konfiguration der redhat Distribution.

$ sudo vi /etc/bashrc

Die Zeile am Ende der Datei ~/.bashrc einfügen.

if [ -f /usr/bin/linux_logo ]; then linux_logo -L redhat -u; fi

Erweitern lässt sich linuxlogo etwa mit folgender Zeile ~/.bashrc

if [ -f /usr/bin/linuxlogo ]; then linuxlogo ;hostnamectl status | grep "Operating System";fi
uname -sor

Linux Logo Parameter

Distributionen:

/usr/bin/linux_logo -L list

Available Built-in Logos:
        Num     Type    Ascii   Name            Description
        1       Banner  Yes     bsd_banner      FreeBSD Logo
        2       Classic Yes     irix            Irix Logo
        3       Classic Yes     bsd             FreeBSD Logo
        4       Banner  Yes     solaris         The Default Banner Logos
        5       Classic Yes     aix             AIX Logo
        6       Classic Yes     classic         The Default Classic Logo
        7       Banner  Yes     debian_banner   Debian Banner (white)
        8       Banner  Yes     mandrake_banner Mandrake(TM) Linux Banner
        9       Banner  Yes     pld             PLD Linux banner
        10      Banner  Yes     suse            SUSE Logo
        11      Banner  Yes     sourcemage_ban  Source Mage GNU/Linux banner
        12      Classic Yes     gnu_linux       Classic GNU/Linux
        13      Classic Yes     core            Core Linux Logo
        14      Classic Yes     debian          Debian Swirl Logos
        15      Banner  Yes     slackware       Slackware Logo
        16      Banner  Yes     mandriva        Mandriva(TM) Linux Banner
        17      Banner  Yes     redhat          RedHat Banner (white)
        18      Banner  Yes     ubuntu          Ubuntu Logo
        19      Classic Yes     debian_old      Debian Old Penguin Logos
        20      Banner  Yes     sme             SME Server Banner Logo
        21      Banner  Yes     sourcemage      Source Mage GNU/Linux large
        22      Banner  Yes     mandrake        Mandrakelinux(TM) Banner
        23      Banner  Yes     banner          The Default Banner Logo
        24      Classic Yes     classic-simp    Classic No Dots Or Letters
        25      Classic Yes     classic-nodots  The Classic Logo, No Periods
        26      Banner  Yes     banner-simp     Simplified Banner Logo

Do "linux_logo -L num" where num is from above to get the appropriate logo.
Remember to also use -a to get ascii version.

Linux Logo Help Screen

/usr/bin/linux_logo -h

Linux Logo Version 5.11 using libsysinfo 0.2.1
        by Vince Weaver <vince@deater.net>
   Newest Versions at:
      https://www.deater.net/weave/vmwprod/linux_logo
      https://metalab.unc.edu/pub/Linux/logos/penguins

Usage:   /usr/bin/linux_logo [-a] [-b] [-c] [-d] [-D file] [-e file] [-f] [-g]
                    [-h] [-i] [-k] [-l] [-n] [-o num] [-p] [-s] [-t str] [-u] [-v]
                    [-w Num] [-x] [-y] [-F format] [-L num | NAME | list | random_xy]
         [-a]     -- Display an ascii-only Logo
         [-b]     -- Display a Banner Logo!
         [-c]     -- Display a "Classic" type logo
         [-d]     -- disable "prettying" of output
         [-D file]-- use custom logo from "file"
         [-e file]-- Use "file" instead of /proc/cpuinfo [for debugging]
         [-f]     -- force the screen clear before drawing
         [-F format] Format output.  See README.
      B  [-g]     -- give system info only
         [-h]     -- this help screen
         [-i]     -- ignore ~/.linux_logo and /etc/linux_logo.conf
         [-k]     -- keep sysinfo flushed-left (non-centered)
      B  [-l]     -- display logo only
      C  [-o Num] -- offset output Num spaces to the right
         [-p]     -- preserve cursor location
         [-s]     -- skip Bogomips [speeds up on non-Linux platforms]
         [-t str] -- display user-supplied string
      *  [-u]     -- show uptime
         [-v]     -- version information
         [-w Num] -- set width of screen to Num [default 80]
      *  [-y]     -- show load average
         [-L num | NAME | list | random_xy] -- multiple Logo options.  See README

 B=Banner mode only, C=Classic Mode Only  *=Works Only in Linux
Die mobile Version verlassen