PS/ÜBUNGSZETTEL ~/04-dateien.ps1 0 / 9 gelöst
PS C:\pollhammer> .\uebungszettel\04-dateien.ps1

04 / Dateien & Ordner

Auf diesem Zettel übst du den Umgang mit Dateien und Ordnern: Existenz prüfen, anlegen, Inhalte schreiben und lesen, kopieren, verschieben, umbenennen und löschen — plus das Auslesen von Datei-Properties wie Name und Größe.

9 Aufgaben Test-Path, New-Item, Inhalte schreiben & lesen, Kopieren & Löschen Fortschritt wird gespeichert
man 04-dateien — das Wichtigste in Kürze
  • Test-Path "C:\Pfad" liefert $true oder $false — erst prüfen, dann handeln.
  • New-Item -ItemType Directory erstellt einen Ordner, -ItemType File eine Datei. -Force verhindert einen Fehler, wenn das Ziel schon existiert.
  • Set-Content ÜBERSCHREIBT den kompletten Inhalt einer Datei — Add-Content hängt an.
  • Get-Content liefert ein Array von Zeilen; mit -Raw bekommst du stattdessen EINEN einzigen String.
  • Copy-Item (Ordner: -Recurse), Move-Item, Rename-Item -NewName, Remove-Item — Achtung: Remove-Item löscht ENDGÜLTIG, es gibt keinen Papierkorb!
  • Get-ChildItem -Filter "*.txt" -Recurse -File filtert nach Muster, steigt in Unterordner hinab und liefert nur Dateien (-Directory = nur Ordner).
  • Dateiobjekte haben Properties: .Name, .BaseName, .Extension, .Length (Bytes), .LastWriteTime. Bytes → KB: [math]::Round($f.Length / 1KB, 1)1KB = 1024.
~/uebungen/04-dateien.ps1 : aufgabe_01✓ gelöstcode vervollständigen
01Existiert der Pfad?
Welches Cmdlet gibt $true oder $false zurück, je nachdem ob der Pfad existiert?
if ( "C:\Backup") {
    Write-Host "Ordner vorhanden"
}

Test-Path prüft, ob eine Datei oder ein Ordner existiert, und liefert $true bzw. $false. Weil das Ergebnis ein Bool ist, passt es direkt in ein if — so prüfst du sicher, BEVOR du liest, kopierst oder löschst.

~/uebungen/04-dateien.ps1 : aufgabe_02✓ gelöst1 aus N
02Set-Content bei vorhandener Datei
Set-Content -Path "log.txt" -Value "Neu"
Die Datei log.txt enthält bereits mehrere Zeilen Text. Was passiert bei diesem Befehl?

Set-Content ERSETZT den kompletten Inhalt — ohne Rückfrage. Zum Anhängen nimmst du Add-Content. Diesen Unterschied zu verwechseln ist die klassische Ursache für versehentlich gelöschte Log-Daten.

~/uebungen/04-dateien.ps1 : aufgabe_03✓ gelöstzuordnung
03Die Item-Cmdlets
Ordne jedem Cmdlet seine Aufgabe zu.
Copy-Item
Move-Item
Rename-Item
Remove-Item

Alle vier folgen dem Verb-Item-Muster: Copy- kopiert (Ordner brauchen -Recurse), Move- verschiebt, Rename- benennt um, Remove- löscht. Merke: Remove-Item löscht SOFORT und ENDGÜLTIG — nichts landet im Papierkorb.

~/uebungen/04-dateien.ps1 : aufgabe_04✓ gelöstcode vervollständigen
04Alles als ein String
Welcher Parameter sorgt dafür, dass Get-Content den kompletten Inhalt als EINEN einzigen String liefert (statt als Zeilen-Array)?
$text = Get-Content -Path "notes.txt" 
$text.Length   # Anzahl ZEICHEN, nicht Zeilen

Ohne -Raw liefert Get-Content ein Array von Zeilen — praktisch für Schleifen. Mit -Raw bekommst du einen einzigen String inklusive aller Zeilenumbrüche, z. B. zum Suchen und Ersetzen im ganzen Text. Deshalb zählt .Length hier Zeichen statt Zeilen.

~/uebungen/04-dateien.ps1 : aufgabe_05✓ gelöstoutput vorhersagen
05Überschreiben oder anhängen?
Set-Content -Path "log.txt" -Value "Alpha"
Set-Content -Path "log.txt" -Value "Beta"
Add-Content -Path "log.txt" -Value "Gamma"
Write-Host (Get-Content -Path "log.txt").Count
Was gibt die letzte Zeile (Write-Host ...) aus?

Das zweite Set-Content überschreibt Alpha komplett — übrig bleibt nur Beta. Add-Content hängt dann Gamma an. Die Datei hat also 2 Zeilen (Beta, Gamma), Get-Content liefert ein Array mit 2 Elementen und .Count ergibt 2.

~/uebungen/04-dateien.ps1 : aufgabe_06✓ gelöstmehrfachauswahl
06Nur Dateien — auch in Unterordnern
Du willst mit Get-ChildItem ALLE Dateien (keine Ordner) finden, auch in sämtlichen Unterordnern. Welche zwei Parameter brauchst du? Kreuze zwei an.

-File beschränkt das Ergebnis auf Dateien (-Directory wäre genau das Gegenteil: nur Ordner). -Recurse steigt in alle Unterordner hinab. -Force zeigt nur versteckte Elemente zusätzlich an, und -Raw gehört zu Get-Content, nicht zu Get-ChildItem.

~/uebungen/04-dateien.ps1 : aufgabe_07✓ gelöstoutput vorhersagen
07Datei-Properties lesen
# Die Datei existiert:
$f = Get-Item "C:\Data\report.txt"
Write-Host "$($f.BaseName)|$($f.Extension)"
Was gibt die letzte Zeile aus? Achte genau auf Punkte!

.BaseName ist der Dateiname OHNE Endung (report), .Extension ist die Endung INKLUSIVE Punkt (.txt). .Name wäre report.txt. Und weil Properties in doppelten Anführungszeichen nicht direkt aufgelöst werden, braucht es die Subexpression $(...).

~/uebungen/04-dateien.ps1 : aufgabe_08✓ gelöstoutput vorhersagen
08Bytes in Kilobytes
$length = 2560
$kb = [math]::Round($length / 1KB, 1)
Write-Host "$kb KB"
Was gibt die letzte Zeile aus?

1KB ist eine eingebaute PowerShell-Konstante für 1024 Bytes. 2560 / 1024 = 2.5, und [math]::Round(..., 1) rundet auf eine Nachkommastelle. PowerShell gibt Zahlen mit Punkt als Dezimaltrenner aus, also erscheint 2.5 KB.

~/uebungen/04-dateien.ps1 : aufgabe_09✓ gelösthands-on
09Mini-Projekt: TestFolder mit Report
Öffne eine echte PowerShell und arbeite die Schritte durch:
  1. Lege mit New-Item den Ordner C:\Temp\TestFolder an (nutze -Force, falls es ihn schon gibt) und erstelle darin mit Set-Content die Datei hello.txt mit dem Inhalt Zeile 1.
  2. Hänge mit Add-Content zwei weitere Zeilen an (Zeile 2 und Zeile 3) und gib die Datei anschließend mit Get-Content aus.
  3. Liste alle *.txt-Dateien im Ordner auf: pro Datei den Namen und die Größe in KB, gerundet auf 1 Nachkommastelle.
# 1) Ordner anlegen + Datei mit erster Zeile erstellen
New-Item -ItemType Directory -Path "C:\Temp\TestFolder" -Force
Set-Content -Path "C:\Temp\TestFolder\hello.txt" -Value "Zeile 1"

# 2) Zwei Zeilen anhaengen und Datei ausgeben
Add-Content -Path "C:\Temp\TestFolder\hello.txt" -Value "Zeile 2"
Add-Content -Path "C:\Temp\TestFolder\hello.txt" -Value "Zeile 3"
Get-Content -Path "C:\Temp\TestFolder\hello.txt"

# 3) Alle *.txt mit Name + Groesse in KB listen
foreach ($file in Get-ChildItem -Path "C:\Temp\TestFolder" -Filter "*.txt" -File) {
    $kb = [math]::Round($file.Length / 1KB, 1)
    Write-Host "$($file.Name) - $kb KB"
}

Set-Content legt die Datei automatisch an, wenn sie noch nicht existiert — ein separates New-Item -ItemType File ist hier also nicht nötig. Add-Content hängt an, statt zu überschreiben. In Schritt 3 filtert -Filter "*.txt" schnell nach Endung, -File schließt Ordner aus, und .Length liefert Bytes, die du mit 1KB (= 1024) in Kilobytes umrechnest.