This commit is contained in:
Harald G. Mueller 2023-01-20 18:29:45 +01:00
parent 288f3d765f
commit f21bb8700d
17 changed files with 327 additions and 72 deletions

View File

@ -1,72 +0,0 @@
# M122 - Übungen
## Dateien und Verzeichnisse anlegen
Ich habe den Bedarf, für alle Lernenden einer Klasse dieselben
Dateien zur Verfügung zu stellen. Ich bereite mich so vor, dass
ich eine Liste mit allen Namen habe. Weiter werde ich ein
Directory namens "_template" bereitstellen, das die Dateien
enthält, die ich in alle Lernenden-Verzeichnisse hineinkopieren
will.
Es gibt mehrere Klassen. Die Lernenden bekommen alle ein eigenes
Verzeichnisse. und jede Klasse bekommt ein Verzeichnis, in dem die
Lernenden-Verzeichnisse gesammelt sind. In jedem dieser Lernenden-Verzeichnisse
sind dann die zur Verfügung gestellten Dateien enthalten.
Damit es bei der Anwendung am Schluss nicht all zu viel Aufwand
gibt, mache ich die Liste der Lernenden einer Klasse in eine Datei,
die schon mit dem Namen der Klasse (und des Moduls) in der Art z.B.
M122-AP22b.txt angelegt ist. Das automatisierte Skript muss dann
"nur" noch den Dateinamen vor dem Punkt auslesen um damit dann
das Grundverzeichnis anzulegen wo dann dort hinein die
Lernenden-Verzeichnisse angelegt werden. Dort hinen, in den
Klassen- und den Lernenden-Verzeichnissen, kommen dann die
bereitgelegten Dateien.
Erstellen Sie folgende Datei- und Verzeichnisstruktur
./M122-AP22b.txt
./_template
Datei-1.txt
Datei-2.docx
Datei-3.pdf
Der Inhalt der M122-AP22b.txt Datei könnte so aussehen:
Amherd
Baume
Berset
Cassis
Keller
Parmelin
Roesti
Es soll nachher eine solche Struktur entstehen:
./M122-AP22b
Amherd
Datei-1.txt
Datei-2.docx
Datei-3.pdf
Baume
Datei-1.txt
Datei-2.docx
Datei-3.pdf
Berset
Datei-1.txt
Datei-2.docx
Datei-3.pdf
usw.
Erstellen Sie ein Skript, das diese Aufgabe erledigt.

View File

@ -0,0 +1,91 @@
# M122 - Übungen
## Dateien und Verzeichnisse anlegen
Ich habe den Bedarf, für alle Lernenden einer Klasse dieselben
Dateien zur Verfügung zu stellen. Es gibt mehrere Klassen. Die
Lernenden bekommen alle ein eigenes Verzeichnisse. Und jede
Klasse bekommt ein Verzeichnis. In diesem Klassen- Verzeichnis
sind dann die Lernenden-Verzeichnisse gesammelt. In jedem dieser
Lernenden-Verzeichnisse werden dann die gewünschten Dateien zur
Verfügung gestellt.
Ich bereite mich so vor, dass ich eine Liste mit allen Namen
aller Lernenden habe. Diese mache ich dann ein eine Datei. Diese
Datei bekommt den Namen (die Abkürzung) der Klasse.
Weiter werde ich ein Verzeichnis namens "_template" bereitstellen.
Da drin werden dann alle Dateien hineingelegt, die allen Lernenden
zur Verfügung gestellt werden sollen.
Strategie (Programmablauf)
Das automatisierte Skript muss jetzt den Dateinamen (vor dem Punkt)
auslesen um damit das Grundverzeichnis anzulegen. Dann muss das
Skrpt die Datei öffnen und alle Namenseinträge auslesen. Die Namen
sind in einer Liste, die ich dann als "array" verwenden werde um
mit jedem (Namens-)Eintrag erstens ein Verzeichnis zu erstellen
und zweitens die Dateien aus dem Template dort hinein zu kopieren.
Erstellen Sie als Ausgangslage folgende Dateien und Verzeichnisstruktur
./M122-AP22b.txt
./_template
Datei-1.txt
Datei-2.docx
Datei-3.pdf
Der Inhalt der M122-AP22b.txt Datei könnte so aussehen:
Amherd
Baume
Berset
Cassis
Keller
Parmelin
Roesti
Es soll nachher eine solche Struktur entstehen:
./M122-AP22b
Amherd
Datei-1.txt
Datei-2.docx
Datei-3.pdf
Baume
Datei-1.txt
Datei-2.docx
Datei-3.pdf
Berset
Datei-1.txt
Datei-2.docx
Datei-3.pdf
usw.
Erstellen Sie ein Skript, das diese Aufgabe erledigt.
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<hr>
<br>
Hier eine Lösung in **PowerShell**.
Versuchen Sie alles in **bash** nachzumachen. Aber Achtung. Manche Dinge kann man oder muss man in **bash** anders machen.
![./loesung-in-powershell/einstieg-prepareFiles-01.ps1](./loesung-in-powershell/einstieg-prepareFiles-01.ps1)

View File

@ -0,0 +1,17 @@
# mal schauen, ob ob ich Verzeichnisse und Dateien anlegen kann
# Verzeichnis anlegen
mkdir _template
#Verzeichnis wechseln
cd .\_template
# Verzeichnis zurück wechseln
cd ..
dir
ls .\_template
echo "---fertig---"

View File

@ -0,0 +1,55 @@
# mal schauen, ob ob ich Verzeichnisse und Dateien anlegen kann
# Verzeichnis anlegen
mkdir _template
#Verzeichnis wechseln
cd .\_template
# Dateien im Verzeichnis anlegen,
# jedoch nur mit Fake-Inhalt damit mal was da ist.
#
# Trick: Mit "echo" wird normalwerweise ein Text
# auf die Konsole herausgeschrieben.
# Mit dem ">" wird dann dieser Output in eine
# Datei umgelenkt. Die Datei wird entweder neu
# angelegt oder ersetzt, wenn es schon eine gibt
echo "datei-1.txt" > datei-1.txt
echo "datei-2.docx" > datei-2.docx
echo "datei-3.pdf" > datei-3.pdf
echo "datei-4.xlsx" > datei-4.xlsx
# Verzeichnis zurück wechseln
cd ..
#############################################
# Namensdatei-Vorlage automatisch erstellen #
#############################################
# Ich speichere mal den Dateinamen in eine Variable,
# weil ich das mehrmals brauche
$namensdatei = "M122-BR23a.txt"
# ich mache die Namendatei gleich zur besseren
# Ordnung in ein entsprechendes Verzeichnis
$verzeichnis_namensdateien = "_namensdateien"
mkdir $verzeichnis_namensdateien
cd $verzeichnis_namensdateien
# Namendatei anlegen und Inhalte reinschreiben
echo "Amherd" > $namensdatei
# Zwei ">" (">>") hängt das neue Material unten an
echo "Baume-Schneider" >> $namensdatei
echo "Berset" >> $namensdatei
echo "Cassis" >> $namensdatei
echo "Keller-Sutter" >> $namensdatei
echo "Parmelin" >> $namensdatei
echo "Roesti" >> $namensdatei # Umlaute wie das "ö" sind mega schlecht
cd ..
# Skript anhalten, um zu sehen, obs Fehler gab
pause

View File

@ -0,0 +1,12 @@
# mal schauen, ob ob ich aus Verzeichnissen, Dateien lesen kann
$verzeichnis_namensdateien = "_namensdateien"
# Da PowerShell objektorientiert ist, kann man gleich das
# Name-Attribut aus der Resultatsliste erfragen.
# Dies wird sogleich in eine Variable gespeichert.
$allFiles = (dir $verzeichnis_namensdateien).name
echo $allFiles
# Skript anhalten, um zu sehen, obs Fehler gab
pause

View File

@ -0,0 +1,26 @@
# mal schauen, ob ob ich aus Verzeichnissen, Dateien lesen kann
$verzeichnis_namensdateien = "_namensdateien"
# Da PowerShell objektorientiert ist, kann man gleich das
# Name-Attribut aus der Resultatsliste erfragen.
# Dies wird sogleich in eine Variable gespeichert.
$allFiles = (dir $verzeichnis_namensdateien).name
# Ich versuche mal alles aufzulisten
# Wir haben jetzt ja in "allFiles" die ganze Liste der Files
# im Verzeichnis gespeichert.
# mit "type" kann ich nun auslesen, was in jeder Datei drin ist.
# Wenn man in PowerShell ein 2echo" auf eine Liste macht,
# kann er die ganze Liste ausdrucken
foreach ($file in $allFiles) {
$fileinhalt = type $verzeichnis_namensdateien/$file
echo $file
echo "---"
echo $fileinhalt
echo "===="
echo ""
}
# Skript anhalten, um zu sehen, obs Fehler gab
pause

View File

@ -0,0 +1,16 @@
$verzeichnis_namensdateien = "_namensdateien"
$allFiles = (dir $verzeichnis_namensdateien).name
# Mir fehlt nun noch, dass ich den Dateinamen inkl. dem Punkt habe.
# aber ich brauche nur den Teil vor dem Punkt.
# Um das zu machen, gibt es eine "split"-Funktion
# Nach dem Split, brauche ich dann die erste Position (=0)
foreach ($file in $allFiles) {
$fileNameVorPunkt = $file.split(".")[0]
echo $fileNameVorPunkt
echo ""
}
# Skript anhalten, um zu sehen, obs Fehler gab
pause

View File

@ -0,0 +1,20 @@
# Jetzt alles zusammen
#
#
#
#
$verzeichnis_template = "_template"
$verzeichnis_namensdateien = "_namensdateien"
$allFiles = (dir $verzeichnis_namensdateien).name
foreach ($file in $allFiles) {
$fileNameVorPunkt = $file.split(".")[0]
echo $fileNameVorPunkt
echo ""
$fileinhalt = type $verzeichnis_namensdateien/$file
foreach ($zeile in $fileinhalt) {
echo $verzeichnis_namensdateien/$file/$zeile
}
}

View File

@ -0,0 +1,17 @@
# Jetzt alles zusammen
#
$verzeichnis_template = "_template"
$verzeichnis_namensdateien = "_namensdateien"
$allFiles = (dir $verzeichnis_namensdateien).name
foreach ($file in $allFiles) {
$fileNameVorPunkt = $file.split(".")[0]
$klasse = $fileNameVorPunkt
$fileinhalt = type $verzeichnis_namensdateien/$file
foreach ($teilnehmer in $fileinhalt) {
mkdir $verzeichnis_namensdateien/$klasse/$teilnehmer
copy $verzeichnis_template/*.* $verzeichnis_namensdateien/$klasse/$teilnehmer
}
}

View File

@ -0,0 +1,17 @@
# erstellt alle Verzeichnisse und kopiert die
# Template-Dateien in alle Teilnehmer aller Klassen
$verzeichnis_template = "_template"
$verzeichnis_namensdateien = "_namensdateien"
$allFiles = (dir $verzeichnis_namensdateien).name
foreach ($file in $allFiles) {
$fileNameVorPunkt = $file.split(".")[0]
$klasse = $fileNameVorPunkt
$fileinhalt = type $verzeichnis_namensdateien/$file
foreach ($teilnehmer in $fileinhalt) {
mkdir $verzeichnis_namensdateien/$klasse/$teilnehmer
copy $verzeichnis_template/*.* $verzeichnis_namensdateien/$klasse/$teilnehmer
}
}

View File

@ -0,0 +1,56 @@
# Erstelle das Template-Verzeichnis und die Dateien
# Verzeichnis anlegen
mkdir _template -ErrorAction Ignore
#Verzeichnis wechseln
cd .\_template
# Dateien im Verzeichnis anlegen,
# jedoch nur mit Fake-Inhalt damit mal was da ist.
echo "datei-1.txt" > datei-1.txt
echo "datei-2.docx" > datei-2.docx
echo "datei-3.pdf" > datei-3.pdf
echo "datei-4.xlsx" > datei-4.xlsx
# Verzeichnis zurück wechseln
cd ..
#############################################
# Namensdatei-Vorlage automatisch erstellen #
#############################################
# Ich speichere mal den Dateinamen in eine Variable,
# weil ich das mehrmals brauche
$namensdatei = "M122-BR23a.txt"
# ich mache die Namendatei gleich zur besseren
# Ordnung in ein entsprechendes Verzeichnis
$verzeichnis_namensdateien = "_namensdateien"
mkdir $verzeichnis_namensdateien -ErrorAction Ignore
cd $verzeichnis_namensdateien
# Namendatei anlegen und Inhalte reinschreiben
echo "Amherd" > $namensdatei
# Zwei ">" (">>") hängt das neue Material unten an
echo "Baume-Schneider" >> $namensdatei
echo "Berset" >> $namensdatei
echo "Cassis" >> $namensdatei
echo "Keller-Sutter" >> $namensdatei
echo "Parmelin" >> $namensdatei
echo "Roesti" >> $namensdatei # Umlaute wie das "ö" sind mega schlecht
# Gleich noch eine zweite Namensdatei
$namensdatei = "M122-SR23a.txt"
echo "Burkhart" > $namensdatei
echo "Chiesa" >> $namensdatei
echo "Jositsch" >> $namensdatei
echo "Noser" >> $namensdatei
cd ..