Table of Contents

Woche 1 - Microsoft Windows Server Kurs

Tag 1: 10.02.2025 Montag

Tag 2: 11.02.2025 Dienstag

—

—

Übung "Verwenden der PowerShell-Hilfe" (Seite 38)

Übung "Verwenden wichtiger Cmdlets" (Seite 38)

Musterlösungen von Michael

# Übung Kapitel 3 Teil 1


#1)
Update-help



#2)
get-help -Name Get-Service
get-help -Name Get-Service -Detailed
get-help -Name Get-Service -Full
get-help -Name Get-Service -Examples



#3)
Get-Help -Name * -Parameter Verb
Get-Help -Name Get-Command -Parameter Verb



#4)
Get-Help -Name Get-Process -Examples



# Übung Kapitel 3 Teil 2

#1)
get-command -verb import
Get-Command -noun csv
Get-Command -Name import-csv


#2)
Get-Service | Get-Member

Get-Service | Get-Member -MemberType Property


#3)
Get-help -Name Get-Module

Get-Help -Name Get-PSDrive -Examples

Get-Help -Name Get-Date -Parameter Format



#4)
Get-Help -Name Get-History -Full
Get-Help -Name Get-Process -Full
Get-Help -Name Get-PSProvider -Online


#5)
Get-Module | Get-Member -MemberType Property
	

Tag 3: 12.02.2025 Mittwoch

Musterlösung zu Übungen zu Where-Object etc

#1)

get-service | Where-Object -Property status -eq stopped

#2)

Get-Process -Name W*
Get-Process w*

Get-Process | Where-Object -Property Name -Like w*

#3)

Get-EventLog -LogName system | Where-Object -FilterScript {$_.EntryType -eq "Warning"}
Get-EventLog -LogName system | Where-Object  EntryType -eq warning

#4)

Get-Command -CommandType Cmdlet | Where-Object -Property Verb -eq import | Measure-Object

#5)

Get-ChildItem -Path C:\Windows| `
Where-Object -FilterScript {$_.Extension -eq ".exe" -and $_.Length -gt 1KB} | `
Sort-Object -Property Length -Descending

Get-ChildItem C:\Windows\*.exe | Where-Object Length -gt 1KB | Sort-Object Length -Descending

Vorlesung

Get-Process -Name a* | Select-Object -Property ProcessName, id, Handles

# Liste der Properties ausgeben von Get-Process
Get-Process | Get-Member

Get-Process -Name a* | Select-Object -Property Name, id, cpu, threads
# Nach Id sortieren
Get-Process | Sort-Object -Property Id

# Nach Cpu sortieren
Get-Process | Sort-Object -Property cpu -Descending
# Get-Process Ausgabe in Datei C:\tmp.txt
Get-Process | Tee-Object -File -Path C:\tmp.txt

# Get-Process Ausgabe in Variable MyList
Get-Process | Tee-Object -Variable MyList
# alle Prozesse anzeigen, deren Id größer als 4000 ist
Get-Process | Where-Object {$_.Id -ge 4000}

# alle Files anzeigen, die größer als 4000 Bytes sind
Get-ChildItem -Path C:\Windows -File | Where-Object {$_.Length -ge 4000}
# alle Prozesse anzeigen, die mit 's' anfangen (=ein paar Dutzend wg svchost)
Get-Process -Name s*

# alle Prozesse anzeigen, die mit 's' anfangen und Unique sind (kommen nur ein paar raus)
Get-Process -Name s*| Select-Object Unique
# 50 neueste EventLog Einträge anzeigen, sortiert nach InstanceId 
Get-EventLog -LogName System -Newest 50 | Sort-Object -Property InstanceId
# Vereinfachte Syntax (einfacher, kann aber keine UND, ODER etc)
Get-Service | Where-Object Status -EQ Running

# Klassische Syntax
Get-Service | Where-Object {$_.Status -EQ "Running"}

Get-Service | Where-Object {$_.Status -EQ "Running" OR $_.Name -Like "s*"}
# 1 Alle Dienste, die nicht aktiv sind
Get-Service | Where-Object {$_.Status -ne "Running"}

# oder
Get-Service | Where-Object Status -eq Stopped

# 2 Alle Prozesse, die mit W beginnen
Get-Process -Name W*
# oder
Get-Process W*

# 3 Alle Ereignisse mit Status Warning
Get-EventLog -LogName System -EntryType Warning

# 4 Wie viele Befehle mit Verb Import
(Get-Command -CommandType Cmdlet -Verb Import).count

# 5 Sortiere alle .exe die größer als 1KB in C:\Windows nach Größe absteigend
Get-ChildItem -Path C:\Windows | Where-Object -FilterScript {$.Extension -eq ".exe" -and $_.Length -gt 1KB} | Sort-Object -Property Length -Descending
# jede Ziffer mit 2 multiplizieren
3,4,5,6,7 | ForEach-Object -Process {$_ * 2}
Get-Service | Group-Object -Property Status

# Dateien nach Erweiterung gruppieren, sortiert nach Anzahl
Get-ChildItem C:\Windows -File | Group-Object -Property Extension | Sort-Object -Property Count -Descending
# Cmdlets zählen
Get-Command -CommandType Cmdlet| MeasureObject

# Dateien nach Erweiterung gruppieren, sortiert nach Anzahl
Get-ChildItem C:\Windows -File | Measure-Object -Property Length -Sum -Maximum -Minimum -Average
Get-Process | Export-Clixml -Path C:\prozess.xml

Übung 4

Meine Lösung:

# 1
Get-Service -Name s* | Where-Object {$_.Status -eq "Stopped"}

# 2
Get-ChildItem C:\Windows -File| Sort-Object Length -Descending | Export-Csv -Path C:\Users\v.kalaschnikow\Desktop\dateien.csv

# 3
Get-Process | Export-Csv -Path C:\Users\v.kalaschnikow\Desktop\processe1.csv
Get-Process | Export-Csv -Path C:\Users\v.kalaschnikow\Desktop\processe2.csv -Delimiter ";"
Get-Process | Export-Csv -Path C:\Users\v.kalaschnikow\Desktop\processe3.csv -UseCulture

# 4
Get-ChildItem -Path C:\Windows -File -Name *.exe | Measure-Object -Property Length -Sum -Average

# 5 a)
1..10 | ForEach-Object -Process {notepad.exe}

# 5 b)
Get-Process -Name notepad | ForEach-Object -Process {Stop-Process $_}

Muster-Lösung von Michael:

# 1
Get-Service -Name s* | Where-Object {$_.Status -EQ "Stopped"}

# Alternative:
Get-Service -Name s* | Where Status -EQ Stopped

# 2
Get-ChildItem C:\Windows -File| Sort-Object -Property Length -Descending | Export-Csv -Path .\dateien.csv

# 3
Get-Process | Export-Csv -Path .\processe1.csv
Get-Process | Export-Csv -Path .\processe2.csv -Delimiter ";"
# nimmt den Trennzeichen abhängig von der Tastatureinstellung, also bei (de_DE) => ";"
Get-Process | Export-Csv -Path .\processe3.csv -UseCulture

# 4
Get-ChildItem -Path C:\Windows -File -Name *.exe | Measure-Object -Property Length -Sum -Average
# Alternative
Get-ChildItem C:\Windows\*.exe | Measure-Object -Property Length -Sum -Average
# Alternative
Get-ChildItem -Path C:\Windows | Where-Object {$_.Extension -EQ ".exe"} | Measure-Object -Property Length -Sum -Average

# 5 a)
1..10 | ForEach-Object -Process {notepad.exe}

# 5 b)
Get-Process -Name notepad | Stop-Process
# Alternative
Get-Process -Name notepad | ForEach-Object -Process {Stop-Process $_}

Skript / Buch

Wir haben Kapitel 4 vom Buch “PowerShell 5. Grundlagen und Verwaltung des Active Directory” durchgenommen (nicht wirklich, aber der Michael orientiert sich ungefähr darauf).

Tag 4: 13.02.2025 Donnerstag

Vorlesung

# alle auflisten
Get-PSProvider

# Info über PSProvider "Registry"
Get-PSProvider -PSProvider Registry
Get-PSDrive -Name Daten

# alle properties anzeigen
Get-PSDrive -Name Daten | Select-Object -Property *
# Verzeichnis C:\Test\Privat anlegen (bzw. muss vorhanden sein), dann PSDrive anlegen
New-PSDrive -PSProvider FileSystem -Name prv -Root C:\Test\Privat

# ins prv wechseln
Set-Location prv:

# Prozesse in die Datei .\prozesse.txt schreiben
Get-Process | Set-Content .\prozesse.txt
Set-Location alias:

# alle in alias: auflisten
Get-ChildItem 

Set-Location env:
# alle in env: auflisten
Get-ChildItem

Set-Location variable:
# alle in variable: auflisten
Get-ChildItem

Set-Location D:\
Set-Location D:\Support
Copy-Item -Path C:\Windows\Logs\DISM\dism.log -Destination C:\MeineLogs

# Rekursiv:
Copy-Item -Path C:\Windows\Logs -Destination C:\MeineLogs

Get-ChildItem -Path C:\Test -Include *.tmp | Remove-Item

Get-ItemProperty -Path C:\test.txt | Select-Object -Property *

# Property "Schreibgeschützt" auf TRUE setzen
Set-ItemProperty -Path C:\test.txt -Name IsReadOnly -Value $true

# Erstellungsdatum auf heute minus 2 Tage setzen
Set-ItemProperty -Path C:\test.txt -Name creationTime -Value ((get-date).addDays(-2))
# (wenn Datei existiert wird sie überschrieben)
Get-Process -Name a* | Set-Content -Path C:\process.txt

# die ersten 2 Zeilen der *.txt Dateien ausgeben
Get-ChildItem -Path C:\*.txt -Recurse | Get-Content -TotalCount 2

# in die Datei notiz.txt Text "Wichtiger Termin um 14 Uhr!" schreiben
Set-Content -Path .\notiz.txt -Value "Wichtiger Termin um 14 Uhr!"
Set-Location -Path HKLM:\SOFTWARE

# Neues Verzeichnis dort (in der Registry) erstellen
# Type "Container" bedeutet so was wie "Verzeichnis" in der Registry
New-Item -Path "MeineSoftware" -ItemType Container 

New-ItemProperty -Path "HKLM:\SOFTWARE\MeineSoftware" -Name Version -Value "1.0" -PropertyType String

# man kann auch Hex-Werte anlegen
New-ItemProperty -Path "HKLM:\SOFTWARE\MeineSoftware" -Name MyHex -Value 0xABC -PropertyType DWORD
Get-ChildItem -Path Env:\
# in die Location alias: wechseln
Set-Location alias:

# Alle Aliase auflisten
Get-ChildItem

# alle auflisten
Get-Alias

# alle wo der Befehl "MyCmd" vorkommt auflisten
Get-Alias -Definition MyCmd
# alle exportieren
Export-Alias -Path alias-export.txt

Import-Alias -Path alias-export.txt


# nur mit den definierten Namen exportieren
Export-Alias -Path alias-export.txt -Name alias1, alias2, alias3

# zu der bestehenden Datei hinzufügen
Export-Alias -Path alias-export.txt -Name alias4, alias5, alias6
Remove-Item -Path alias:\aliasNameToRemove

Übung 5.9 (Seite 78)

# 1
Get-PSDrive -PSProvider FileSystem

# 2 a)
New-Item -Path C:\Testdaten -ItemType Directory

# Alternativ
# mkdir C:\Testdaten

# 2 b)
New-PSDrive -PSProvider FileSystem -Name Testdaten -Root C:\Testdaten

# 2 c)
Set-Location Testdaten:

# 3 a)
New-Item notiz.txt -ItemType File

# 3 b)
Get-Process -Name s*, w* | Select-Object –Property Name, ID | Set-Content .\prozesse.txt
# Alternativ
# Get-Process | Select-Object –Property Name, Id | Where {$_.Name -Like "s*" -or $_.Name -Like "w*"} | Set-Content .\prozesse.txt

# 4. Schreiben Sie in die Datei notiz.txt
# a) aktuelle Datumsinformationen sowie
Get-Date | Set-Content .\notiz.txt
# Alternativ
# Add-Content -Path .\notiz.txt -Value (Get-Date)

# b) die Liste der Dateinamen im Laufwerk Testdaten:.
Set-Location Testdaten:
Get-ChildItem Testdaten: | Add-Content -Path .\notiz.txt

# 5. Versehen Sie die Datei prozesse.txt mit einem Schreibschutz.
Set-ItemProperty -Path C:\Testdaten\prozesse.txt -Name IsReadOnly -Value $true

# 6. Löschen Sie den Inhalt(!) der Datei prozesse.txt.
Clear-Content -Path .\prozesse.txt
# tut nicht, da IsReadOnly auf true steht, also zuerst auf false setzen oder mit -Force Parameter
Clear-Content -Path .\prozesse.txt -Force

# 7. Löschen Sie das virtuelle PowerShell-Laufwerk Testdaten: aus der Liste der PowerShell-Laufwerke.
# (alle Laufwerke kann man mit "Get-PSDrive" auflisten)
Remove-PSDrive Testdaten
# wird nicht direkt funktionieren, da "Testdaten" aktuelles Laufwerk ist
# => also zuerst auf ein anderes Laufwerk wechseln (z.B. mit "Set-Location C:")
# ODER auch mit -Force Parameter
Remove-PSDrive Testdaten -Force

Übung 6.6 (Seite 85)

Meine Lösung:

# 1. Listen Sie alle Aliase auf, deren Name mit dem Buchstaben H beginnen.
Get-Alias -Name H*

# 2. Listen Sie alle Aliase für das Cmdlet Remove-Item auf.
Get-Alias -Definition Remove-Item

# 3. Definieren Sie drei eigene Aliase mit den Namen aaa, bbb und ccc, die stellvertretend für die Cmdlets GetProcess, Get-Random und Get-Service verwendet werden sollen.
New-Alias -Name "aaa" Get-Process
New-Alias -Name "bbb" Get-Random
New-Alias -Name "ccc" Get-Service

# Macht es einen Unterschied, ob Sie für die Definition der Aliase das Cmdlet New-Alias oder das
# Cmdlet Set-Alias verwenden?
#
# Antwort: 
# Ja, New-Alias kann nur erstellen. Wenn Alias vorhanden, wird es New-Alias auf Fehler gehen. 
# Also wenn vorhanden kann man nur Set-Alias verwenden.

# 4. Exportieren Sie die drei gerade definierten Aliase in eine Textdatei eigene-aliase.txt im aktuellen
# Verzeichnis.
Export-Alias -Path .\Desktop\eigene-aliase.txt -Name aaa, bbb, ccc

# 5. Definieren Sie einen vierten Alias ddd für das Cmdlet Get-PSProvider.
Set-Alias -Name "ddd" Get-PSProvider

# 6. Exportieren Sie den vierten Alias in die vorhandene Textdatei eigene-aliase.txt. Überschreiben Sie dabei
# nicht die bereits vorhandenen Daten.
Export-Alias -Path .\Desktop\eigene-aliase.txt -Name ddd -Append

# 7. Schließen Sie die PowerShell und öffnen Sie sie erneut. Importieren Sie Ihre eigenen Aliase aus der Datei
# eigene-aliase.txt. Überprüfen Sie dann, ob die Aliase vorhanden sind.
Import-Alias -Path .\Desktop\eigene-aliase.txt

# 8. Löschen Sie manuell die vier von Ihnen erstellten Aliase.
Remove-Item -Path alias:\aaa, alias:\bbb, alias:\ccc, alias:\ddd

Musterlösung von Michael:

# Aufgabe 1
Get-Alias -Name h*

# Aufgabe 2
Get-Alias -Definition Remove-Item

# Aufgabe 3
Set-Alias -Name aaa -Value Get-Process
Set-Alias -Name bbb -Value Get-Random
Set-Alias -Name ccc -Value Get-Service

# Aufgabe 4
Export-Alias -Path .\eigene-aliase.txt -Name aaa, bbb, ccc

# Aufgabe 5
Set-Alias -Name ddd -Value Get-PSProvider

# Aufgabe 6
Export-Alias -Path .\eigene-aliase.txt -Name ddd -Append

# Aufgabe 7
Import-Alias -Path .\eigene-aliase.txt
Get-Alias -Name aaa, bbb, ccc, ddd

# Aufgabe 8
Remove-Item -Path Alias:\aaa
Remove-Item -Path Alias:\bbb
Remove-Item -Path Alias:\ccc
Remove-Item -Path Alias:\ddd

Tag 5: 14.02.2025 Freitag

Vorlesung

Get-PSDrive
cd variable:
# Ausgabe einer Variable
$HOME
C:\Users\Administrator
New-Variable -Name myVar -Value 123
New-Variable -Name zahl1
New-Variable -Name zahl2 -Value 200
New-Variable -Name text1 -Value "Hallo, Welt!"

# alle auflisten
Get-Variable

# Wert setzen
Set-Variable -Name zahl2 -Value 200

# Erstellen (vereinfachte Schreibweise) mit Wert 300
$zahl3 = 300

# Ändern auf 200
$zahl3 = 200

# Inhalt löschen
$zahl3 = $null

# Typbindung gibt es nicht
$text2 = 50
$text2 = "Das ist ein Text"
# aktuelles Datum speichern
$datum1 = Get-Date

# Zeichenkette "Get-Date" drin (!)
New-Variable -Name datum1 -Value Get-Date

# Datum drin (wg. Klammern)
New-Variable -Name datum1 -Value (Get-Date)
# Type explizit definieren
[int] $zahl5=200

# geht nicht wg. Typeverletzung
$zahl5 = "MeinText"
# array
$zahlen=1,2,3,200

# dem nullten element wert zuweisen
$zahlen[0] = 23

# Wert des nullten Elementes holen
$zahlen[0]

# Ein Element zum Array hinzufügen
$zahlen += 250

# prozesse in den array holen
$prozesse = Get-Process

# das 4-te element holen
$prozesse[4]

# dateien aus C:\Windows in Variable speichern
$dateien = Get-ChildItem C:\Windows\ -File

# Alle properties von dem 2-ten element holen
$dateien[2] | Select -Property *
New-Variable -Name MyConst -Value 3.1415 -Option Constant
# Mit double quotes wird die Variablenauflösung gemacht
Write-Host "Ergebnis: $ergebnis"

# Mit single quotes wird KEINE Variablenauflösung gemacht
Write-Host 'Ergebnis: $ergebnis#
"ab" -In "ab", "bc", "cd"

…

If($x -eq 27)
{
  Write-Host "Der Wert der Variable x ist gleich 27"
}
If($x -eq 27)
{
  Write-Host "Der Wert der Variable x ist gleich 27"
}
Else
{
  Write-Host "Der Wert der Variable x ist nicht 27"
}
$eingabe = read-host -Prompt "Bitte eine Zahl eingeben"
If($eingabe -gt 8)
{
  Write-Host "Die Zahl $eingabe ist größer 8"
}
Else
{
  Write-Host "Die Zahl $eingabe ist kleiner oder gleich 8"
}
if($x -eq 27)
{
  Write-Host "Der Wert ist 27"
}
switch ($variable)
{
  Wert1 {
    # block1
  }
  Wert2 {
    # block1
  }
  default {
    # default block
  }
}
for($a=1;$a -le 5; $a++)
{
# ...
}
$array = 2, 4, 5, 6
forEach($wert in $array)
{
# ...
}

# anderes Beispiel
$dateien = Get-ChildItem C:\Windows -File
forEach($datei in $dateien)
{
# ...
  $datei.Length / 1024 + " KB" + " - " + $datei.Name
}

Übung 8.18 Teil 1 (Seite 118)

# 1. 
# a) Erstellen Sie eine Variable $geld und weisen Sie ihr den Wert 68 zu.
$geld = 68


# b) Teilen Sie den Wert mit einem weiteren Befehl durch 4. Nutzen Sie dafür einen möglichst kurzen Befehl.
$geld /= 4

# c) Erstellen Sie eine Konstante $c_euro mit dem Wert Euro in meiner Geldbörse.

New-Variable -Name c_euro -Value "Euro in meiner Geldbörse" -Option Constant

$c_euro

# d) Lassen Sie den Satz "Ich habe x Euro in meiner Geldbörse." ausgeben. Anstelle des "x" soll der Wert der Variablen $geld stehen.

"Ich habe $geld Euro in meiner Geldbörse"

# 2. a) Legen Sie eine Arrayvariable $prozesse an, die als Werte die Namen der aktuell auf Ihrem System
# laufenden Prozesse enthält.
$processe = (Get-Process).Name

# b) Lassen Sie sich den 6. Eintrag des Arrays anzeigen.
$processe[5]

# 3. a) Vergleichen Sie, ob "Hans" mit "hans" identisch ist (einmal mit und einmal ohne Unterscheidung von
# Groß- und Kleinschreibung).
"Hans" -eq "hans"

"Hans" -ceq "hans"


# b) Prüfen Sie, ob 74 / 3 größer oder gleich 24.6 ist.

(74 / 3) -ge 24.6 

# c) Finden Sie heraus, ob im Wert der Variablen $HOME der Buchstabe o enthalten ist.
$HOME -Match "o"
# alternative
$HOME -Like "*o*"

Übung 8.18 Teil 2 (Seite 118)

Meine Lösung:

# 1. 
# a) Speichern Sie einen Wert zwischen 1 und 10 in einer Variablen. Fragen Sie ab, ob der Wert größer als 5
# ist, und geben Sie den Text "Wert ist größer als 5" aus, wenn die Bedingung zutrifft.

#$myVar = 4

$myVar = Read-Host -Prompt "Bitte geben Sie eine Zahl ein"
if($myVar -gt 5)
{
  "Der Wert $myVar ist größer als 5"
}


# b) Erweitern Sie das Beispiel: Prüfen Sie, ob der Variablenwert gleich 5 ist, und geben Sie in dem Fall den
# Text "Wert ist gleich 5" aus.

#$myVar = 5
$myVar = Read-Host -Prompt "Bitte geben Sie eine Zahl ein"
if($myVar -gt 5)
{
  "Der Wert $myVar ist größer als 5"
}
ElseIf($myVar -eq 5)
{
  "Der Wert $myVar ist gleich 5"
}

# c) Erweitern Sie nochmals das Beispiel: Geben Sie jetzt noch für alle anderen Fälle den Text "Wert ist
# kleiner als 5" aus. (Prüfen Sie mit unterschiedlichen Werten.)

$myVar = 4
if($myVar -gt 5)
{
  "Der Wert $myVar ist größer als 5"
}
ElseIf($myVar -eq 5)
{
  "Der Wert $myVar ist gleich 5"
}
Else
{
  "Der Wert $myVar ist kleiner als 5"
}

# 2. Legen Sie eine Variable $note an und weisen Sie ihr einen Wert zwischen 1 und 6 zu. Verwenden Sie die
# Switch-Anweisung, um für die Werte die entsprechenden Texte gemäß der folgenden Tabelle auszugeben:
# Note Text
# 1 sehr gut
# 2 gut
# 3 befriedigend
# 4 ausreichend
# 5 mangelhaft
# 6 ungenügend
# Experimentieren Sie mit verschiedenen Werten.

#$note = 1
$note = Read-Host -Prompt "Bitte geben Sie eine Note ein: "
Switch ($note)
{
  1 {
    "sehr gut"
  }
  2 {
    "gut"
  }
  3 {
    "befriedigend"
  }
  4 {
    "ausreichend"
  }
  5 {
    "mangelhaft"
  }
  6 {
    "ungenügend"
  }
  default {
    "Diese Note ist nicht bekannt"
  }
 
}

# 3. Programmieren Sie eine Schleife, die die Werte 10 bis 100 in Zehnerschritten ausgibt.

For($i=10;$i -le 100; $i+=10) 
{
  $i
}

# 4. Geben Sie mithilfe einer For-Schleife die ganzen Vielfachen der Zahl 5 bis zum Wert 100 aus.
For($i=1;$i -le 100; $i++) 
{
  if($i%5 -eq 0)
  {
    $i
  }
}

Muster-Lösung von Michael:

# Uebung zu Kapitel 8

#1a. Erstellung einer Variablen geld und Zuweisung des Wertes 68
$geld = 68




#1b. Den Wert der Variablen durch 4 Teilen mit einem kurzen Befehl

$geld /= 4




#1c. Erstellung einer Konstanten $c_euro mit dem Wert "Euro in meiner Geldbörse"
New-Variable -Name c_euro -Value "Euro in meiner Geldbörse" -Option Constant




#1d.  Ausgabe des Wertes mit der Konstanten
Write-Host "Ich habe $geld $c_euro."
Write-Host 'Ich habe $geld $c_euro.'


write-host ("Ich habe " + $geld + " " + $c_euro + ".")





#2a. Variable prozesse anlegen die alle Namen der laufenden Prozesse erhalten soll
$prozesse = Get-Process | Select-Object -Property Name




#2b. Anzeige des 6. Prozesses aus der Liste
$prozesse[5]







#3a. Vergleiche die Strings hans und Hans. Einmal CS einmal CI
"Hans" -eq "hans"
"Hans" -ceq "hans"




#3b. prüfe ob 74/3 größer als 24.6 ist
(74/3) -ge 24.6




#3c. hersausfinden ob in der Variablen $Home das Zeichen o enthalten ist
$HOME -match "o"
$HOME -like "*o*"





#4a. in einer Variablen einen wert zwischen 1 und 10 speicher und prüfen ob der Wert größer 5 ist
#$wert = 6

$wert = Read-Host -Prompt "Geben Sie eine Zahl ein"
if ($wert -gt 5)
{
 Write-Host " Der Wert der Variablen ist $wert und ist größer als 5"
}




#4b. Beispiel 4a erweitern mit der Prüfung gleich 5
#$wert = 5

$wert = Read-Host -Prompt "Geben Sie eine Zahl ein"
if ($wert -gt 5)
{
 Write-Host " Der Wert der Variablen ist $wert und ist größer als 5"
}
elseif($wert -eq 5)
{
  Write-Host " Der Wert der Variablen ist $wert und ist gleich 5"
}




#4c. Beispiel aus 4b erweitern mit dem Fall $wert ist kleiner als 5 
#$wert = 3

$wert = Read-Host -Prompt "Geben Sie eine Zahl ein"
if ($wert -gt 5)
{
 Write-Host " Der Wert der Variablen ist $wert und ist größer als 5"
}
elseif($wert -eq 5)
{
  Write-Host " Der Wert der Variablen ist $wert und ist gleich 5"
}
else
{
 Write-Host " Der Wert der Variablen ist $wert und kleiner als 5"
}





#5. anlegen der Variablen Note und zuweisen eines Wertes von 1 bis 6. ausgabe der zahl als Text mit Switch
#$Note = 3

$Note = Read-Host -Prompt "Geben Sie eine Schulnote ein"
switch($Note)
{
 1 {write-host "Note: Sehr gut"}
 2 {write-host "Note: Gut"}
 3 {write-host "Note: Befriedigend"}
 4 {write-host "Note: Ausreichend"}
 5 {write-host "Note: Mangelhaft"}
 6 {write-host "Note: Ungenügend"}
 default {"Diese Note ist nicht bekannt!"}
}





#6. Erstellung einer Schleife welche die Werte von 10 bis 100 in 10er Schritten ausgibt
$zaehler = 10
while($zaehler -le 100)
{
 Write-Host $zaehler
 $zaehler = $zaehler + 10
}





#7. Alle Vielfachen der Zahl 5 bis 100 ausgeben mit einer For Schleife
for($zaehler = 5; $zaehler -le 100; $zaehler = $zaehler + 5)
{
 Write-Host $zaehler
}

Übung 8 (Von Michael als "Extra-Aufgabe")

Noch nicht fertig…

# Legen Sie ein Verzeichnis C:\TestVZ an wenn es noch nicht existiert!
# Falls das Verzeichnis existieren sollte dann löschen Sie den Inhalt vollständig.
$myPath="C:\Users\v.kalaschnikow\Desktop"

cd $myPath

If((Test-Path -Path "$myPath\TestVZ" ))
{
  "TestVZ existiert"

  cd "$myPath\TestVZ"
  $children = (Get-ChildItem)
  ForEach($currentChild in $children) {
    Remove-Item $currentChild
  }
}
else
{
  "TestVZ existiert NICHT"
  
  mkdir TestVZ
  #New-Item -Name "TestVZ" -ItemType Directory
}


# Legen Sie 20 Dateien mit dem Namen "MeineDatei(x).txt" in dem Verzeichnis C:\TestVZ an
# wobei x durch die Zahlen 1 bis 20 ersetzt wird

cd "$myPath\TestVZ"

for($x=1;$a -le 20; $a++)
{
  Set-Content .\MeineDatei($x).txt
}

# Prüfen Sie das aktuelle Datum Ihres Systems. 
# Falls das Datum in der ersten Hälfte des Monats befindet, (also zwischen dem 1 und 15), legen Sie eine 
# Datei mit dem Namen "MeineProzesse.txt" mit dem Inhalt der aktuellen Prozesse Ihres Systems an.

Get-Date | Set-Content .\MeineProzesse.txt

# Falls das Datum in der zweiten Hälfte des Monats befindet, (> 15), legen Sie eine 
# Datei mit dem Namen "MeineDienste.txt" mit dem Inhalt der aktuellen Dienste Ihres Systems an.
$day = Get-Date | Get-Member -MemberType day
if()

# Ermitteln Sie den Wert des Attributes "LasAccessTime" aller Dateien im Verzeichnis TestVZ und ändern Sie 
# den Wert  gemäß der aktuellen Uhrzeit wie folgt:
# Vor 12 Uhr: heutiges Datum - 1 Tag
# Nach 12 Uhr: heutiges Datum - 2 Tage

# Prüfen Sie die Angaben des Attributes "LastAccessTime" auf deren erfolgreiche Änderungen

Muster-Lösung von Michael:

# Beispiel zu Kontrollstrukturen und Variablen





$VerzeichnisVorhanden = Test-Path -Path c:\TestVZ



if(-not $VerzeichnisVorhanden)
{
    New-Item -ItemType Directory -Path c:\TestVZ
}

else
{
    Get-ChildItem -Path c:\TestVZ\*.* -Recurse | Remove-Item -Force
}






for($i=1; $i -le 20; $i++)
{
    New-Item -ItemType File -Path C:\TestVZ -name "MeineDatei$i.txt" 
}







$Datum = (get-date).Day
if($Datum -lt 16)
{
    Get-Process | out-file -FilePath C:\TestVZ\MeineProzesse.txt
}
else
{
    Get-Service | Out-File -FilePath C:\TestVZ\MeineDienste.txt
}





$Dateien = Get-ChildItem C:\TestVZ -File

foreach ($Datei in $Dateien)
{
  If ((Get-date).Hour -lt 12)
  {
    $NeuesDatum = (get-date).AddDays(-1)
  }
  else
  {
    $NeuesDatum = (get-date).AddDays(-2)
  }

    ($Datei).LastAccessTime = $NeuesDatum
  
}



Get-ChildItem C:\TestVZ -File | select -Property Name, LastAccessTime

Übung 9

Musterlösung von Michael:

$VerzeichnisVorhanden = Test-Path -Path c:\testVZ

if(-not $VerzeichnisVorhanden)
{
New-Item -ItemType Directory -Path c:\testVZ
}
else
{
Get-ChildItem -Path c:\testVZ\*.* | Remove-Item -Force
}

$FreeSpace = (get-psdrive -Name c).free
$DiskSize = $FreeSpace + (get-psdrive -Name c).used


# $FreeSpace = (Get-CimInstance -ClassName Win32_LogicalDisk).freespace
# $DiskSize = (Get-CimInstance -ClassName Win32_LogicalDisk).size

if((100 / $DiskSize * $FreeSpace) -gt 5 )
{
    for($i=1; $i -le 20; $i++)
    {
        if (($i + 2) % 3 -ne 0)
        {
            continue
        }
    New-Item -ItemType File -Path C:\TestVZ -name "MeineNeueDatei$i.txt" 
    }
}

else
{
  Write-Host "Platz auf dem Datenträger nicht ausreichend"
}