woche_1_-_microsoft_windows_server_kurs
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| woche_1_-_microsoft_windows_server_kurs [2025/02/17 08:56] – [Übung 8.18 Teil 2 (Seite 118)] kalaschnikow | woche_1_-_microsoft_windows_server_kurs [2025/03/31 15:11] (current) – [Woche 1 - Microsoft Windows Server Kurs] kalaschnikow | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Woche 1 - Microsoft Windows Server Kurs ====== | ||
| + | * [[GFN Sysadmin Kurs]] | ||
| + | * [[Microsoft Windows Server Kurs]] | ||
| + | * [[Woche 1 - Microsoft Windows Server Kurs]] | ||
| + | * [[Woche 2 - Microsoft Windows Server Kurs]] | ||
| + | * [[Woche 3 - Microsoft Windows Server Kurs]] | ||
| + | * [[Woche 4 - Microsoft Windows Server Kurs]] | ||
| + | * [[Woche 5 - Microsoft Windows Server Kurs]] | ||
| + | * [[Woche 6 - Microsoft Windows Server Kurs]] | ||
| + | * [[Woche 7 - Microsoft Windows Server Kurs]] | ||
| + | * [[Woche 8 - Microsoft Windows Server Kurs]] | ||
| + | |||
| + | |||
| + | * [[Moegliche Pruefungsfragen - Microsoft Windows Server Kurs]] | ||
| + | |||
| + | |||
| + | ===== Tag 1: 10.02.2025 Montag ===== | ||
| + | |||
| + | * Themen dieser Woche: | ||
| + | * PowerShell | ||
| + | * IP Adressierung | ||
| + | * Subnettierung | ||
| + | * Supernettierung | ||
| + | * NAT | ||
| + | * DNS | ||
| + | * DHCP | ||
| + | * Active Directory | ||
| + | |||
| + | * Verzeichnis " | ||
| + | * Win11_German | ||
| + | * Windows_Server_2022_German | ||
| + | |||
| + | * SLMGR | ||
| + | * Service License Manager (?) | ||
| + | |||
| + | * In der virtuellen Umgebung (Remote Lab Host) | ||
| + | * " | ||
| + | * Große Symbole | ||
| + | * System | ||
| + | * Windows Edition auf dem Host | ||
| + | * = Windows Server 2022 Datacenter | ||
| + | * = RAM = 24 GB (auf dem Server für jeden) | ||
| + | * = Xeon | ||
| + | * Verwaltung der Virtuellen Maschinen | ||
| + | * Hyper-V manager | ||
| + | |||
| + | * Jetzt Im Hyper-V manager: | ||
| + | |||
| + | * Host " | ||
| + | * Im Arbeitsbereich | ||
| + | * GFN-DC (Domänenkontroller) | ||
| + | * ... | ||
| + | * Aktionsbereich (rechts) | ||
| + | * Host auswählen (WIN-DH...) | ||
| + | * Aktion " | ||
| + | * Virt.Festplatten= '' | ||
| + | * Virt.Computer= '' | ||
| + | * Live Migrationen | ||
| + | * Speichermigrationen | ||
| + | |||
| + | * Manager Virt.Switches | ||
| + | * GFN-Privat | ||
| + | * aufklappen | ||
| + | * Erweiterungen | ||
| + | * R_LAB_Internet_NICHTS_AENDERN | ||
| + | * Globale Einstellungen | ||
| + | * MAC-Adressbereich | ||
| + | |||
| + | * Tag 1 | ||
| + | * Unterschied Client-Server | ||
| + | * SAM | ||
| + | * LSA (Local Security Authority) | ||
| + | * Hardware Anforderungen | ||
| + | * Erste Schritte mit einem Server | ||
| + | * Rollen und Features | ||
| + | * Windows Admin Center | ||
| + | * Windows 11 als Client | ||
| + | |||
| + | * Die Versionen von Windows Server 2022 (Prüfungsfrage!) | ||
| + | * Essentials | ||
| + | * SQL Server | ||
| + | * Exchange | ||
| + | * "File Server" | ||
| + | * ... | ||
| + | * Standard | ||
| + | * keine Einschränkung | ||
| + | * bzgl. Ressourcen (?) | ||
| + | * bzgl. Benutzerzugriffe | ||
| + | * Datacenter | ||
| + | * max. 16 Knoten | ||
| + | * Datacenter Azure Edition | ||
| + | |||
| + | * SAM = Security Account Manager | ||
| + | * Locale Benutzer verwalten | ||
| + | * Benutzer & Gruppen verwalten | ||
| + | |||
| + | * Hyper-V Manager | ||
| + | * Neu -> Virt. Computer | ||
| + | * Assistent startet | ||
| + | * Name | ||
| + | * WS-2022-BSP1 | ||
| + | * Generation | ||
| + | * Gen 1 | ||
| + | * 32 und 64 bit | ||
| + | * nur IDE | ||
| + | * Gen 2 | ||
| + | * 64 bit | ||
| + | * SCSI | ||
| + | * UEFI (statt BIOS) | ||
| + | * => Generation 2 wählen | ||
| + | * Speicher | ||
| + | * in 1024 Schritten | ||
| + | * => 4096 MB | ||
| + | * Option " | ||
| + | * Netzwerk | ||
| + | * " | ||
| + | * Virtuelle Festplatten | ||
| + | * momentan alles so wie es ist lassen | ||
| + | * Installationsoptionen | ||
| + | * von startbaren Imagedatei | ||
| + | * Zusammenfassung | ||
| + | * Im Hyper-V Manager | ||
| + | * den (neu erstellten) Server auswählen (also den " | ||
| + | * Firmware (=Bootreihenfolge ändern) | ||
| + | * umstellen in: | ||
| + | * 1. Festplatte | ||
| + | * 2. DVD | ||
| + | * 3. Netzwerk | ||
| + | * Sicherheit | ||
| + | * " | ||
| + | * -> "MS Windows" | ||
| + | * " | ||
| + | * Arbeitsspeicher | ||
| + | * alles (?) | ||
| + | * Prozessor | ||
| + | * -> auf 2 umstellen | ||
| + | * SCSI | ||
| + | * nichts ändern | ||
| + | * Netzwerkkarte | ||
| + | * nichts ändern | ||
| + | * also: nur bei " | ||
| + | * Server starten | ||
| + | * WICHTIG: rechtzeitig Taste drücken | ||
| + | * ... | ||
| + | * "Jetzt installieren" | ||
| + | * "Ich habe keinen Product Key" | ||
| + | * Zu installierendes Betriebssystem | ||
| + | * -> Datacenter (Desktopdarstellung) | ||
| + | * WICHTIG: diese Option wählen, da sonst keine GUI da ist! | ||
| + | * Lizenz akzeptieren | ||
| + | * Installationsart | ||
| + | * -> Benutzerdefiniert | ||
| + | * Wie möchten Sie das Betriebssystem installieren | ||
| + | * -> 127 GB (= vollständig) | ||
| + | |||
| + | * Nach dem Start muss man " | ||
| + | * => über Fenstermenü " | ||
| + | * Netzwerke | ||
| + | * " | ||
| + | * -> Ja | ||
| + | * Admin Center noch nicht installieren | ||
| + | * => Einfach schließen (?) | ||
| + | |||
| + | * Nach dem Serverstart | ||
| + | * Win Menü | ||
| + | * " | ||
| + | * Im Server Manager | ||
| + | * Dashboard | ||
| + | * Lokaler Server | ||
| + | * Computername | ||
| + | * am besten gleich ändern (in das gleiche wie vorhin, also " | ||
| + | * Arbeitsgruppe " | ||
| + | * ... | ||
| + | * Ereignisse | ||
| + | * ... | ||
| + | |||
| + | * " | ||
| + | * auch in den Kacheln zu finden | ||
| + | * Verwaltungsprogramme | ||
| + | * Systemkonfiguration | ||
| + | * Systeminformation | ||
| + | * Computerverwaltung | ||
| + | * Aufgabenplanung | ||
| + | * ... | ||
| + | * Gerätemanager | ||
| + | * Systemsteuerung | ||
| + | * am besten Anzeige auf " | ||
| + | * Lokale Benutzer / Gruppen | ||
| + | * Benutzer | ||
| + | * neuen Benutzer erstellen | ||
| + | * " | ||
| + | * -> deaktivieren | ||
| + | * " | ||
| + | * -> aktivieren | ||
| + | * Gruppe | ||
| + | * Administratoren | ||
| + | * den Benutzer dorthin hinzufügen | ||
| + | |||
| + | |||
| + | * Zustand vom Server " | ||
| + | * Prüfpunkt erstellen (im Hyper-V Manager ?) | ||
| + | |||
| + | * Misc: | ||
| + | * Passes | ||
| + | * Administrator / AdminPass=8 | ||
| + | * kalaschnikow / VKPass=8 | ||
| + | |||
| + | ===== Tag 2: 11.02.2025 Dienstag ===== | ||
| + | |||
| + | * PowerShell | ||
| + | * Prozesse automatisieren | ||
| + | * die Server-Anwendungen können damit vollständig automatisiert administriert werden | ||
| + | * z.B. Exchange oder sogar Azure | ||
| + | * Evaluierungszyklus (?) kann NUR über PowerShell administriert werden | ||
| + | * 14-20 Tausend Befehle | ||
| + | * Objektorientiert | ||
| + | * .NET-basiert | ||
| + | |||
| + | --- | ||
| + | * Windows 11 Client anlegen (hat mit dem heutigen Thema nichts zu tun) | ||
| + | * Hyper-V-Manager verwenden | ||
| + | * dort einen virtuellen Rechner anlegen | ||
| + | * Name: WC-11-BSP2 | ||
| + | * Generation 2 (NUR Gen2!) | ||
| + | * 8192 MB | ||
| + | * Verbindung " | ||
| + | * Virt... | ||
| + | * hier nichts ändern | ||
| + | * Image: Win11_German_22...iso | ||
| + | * Einstellungen vom Client | ||
| + | * Startreihenfolge | ||
| + | * Festplatte | ||
| + | * DVD | ||
| + | * Netz | ||
| + | * Sicherheit | ||
| + | * Trusted Platform Module (TPM) | ||
| + | * -> aktivieren | ||
| + | * Prozessoren | ||
| + | * 4 | ||
| + | * Starten | ||
| + | * DE/DE/DE | ||
| + | * Setup wird gestartet | ||
| + | * " | ||
| + | * Lizenz akzeptieren | ||
| + | * Benutzerdefiniert | ||
| + | * 127 GB (so lassen) | ||
| + | * Server Manager (auf dem gestarteten Rechner) | ||
| + | * jeder Server ist anders | ||
| + | * Rollen | ||
| + | * normalerweise nur eine Rolle auf dem Server | ||
| + | * e.g. "DB Server" | ||
| + | * Tastaturlayout (nicht ändern?) | ||
| + | * Benennen wir Ihr Gerät | ||
| + | * WC-11-BSP2 | ||
| + | * -> Weiter | ||
| + | * dann startet der Rechner neu (wg. Namensänderung) | ||
| + | * Wie möchten Sie Ihre Gerät einrichten? | ||
| + | * -> "Für Arbeit..." | ||
| + | * Einrichtung Kontos | ||
| + | * Anmeldeoptionen | ||
| + | * Stattdessen Domäne beitreten | ||
| + | * Von wem wird dieses Gerät... | ||
| + | * Name: " | ||
| + | * Kennwort | ||
| + | * Sicherheitsabfrage 1/2/3 | ||
| + | * Standort | ||
| + | * Nein | ||
| + | * Suchen | ||
| + | * Nein | ||
| + | * Diagnose | ||
| + | * Nur die erforderliche | ||
| + | * Werbe-ID | ||
| + | * Nein | ||
| + | * Nach Updates wird gesucht... | ||
| + | * N.B. Wenn der Rechner gelöscht wird, dann sollte man auch die virtuellen Festplatten auch löschen (in '' | ||
| + | * Auf Win 11 gibt es keinen " | ||
| + | * Win-Knopf mit rechten Maustaste | ||
| + | * dann " | ||
| + | * Lokale Benutzer & Gruppen | ||
| + | * Der Benutzer, der angeklickt wurde ist automatisch " | ||
| + | * Einstellungen | ||
| + | * System | ||
| + | * ... | ||
| + | * Computernamen ändern | ||
| + | * Windows Tools (auf dem Win 11 Client) = Windows Verwaltungsprogramme (auf dem Server) | ||
| + | |||
| + | --- | ||
| + | |||
| + | * Servermanager | ||
| + | * Oben " | ||
| + | * Rollen und Features hinzufügen | ||
| + | * Assitent startet | ||
| + | * den Server auswählen | ||
| + | * Serverrollen | ||
| + | * z.B. " | ||
| + | * Features | ||
| + | * z.B. " | ||
| + | * Task Manager (auf R-LAB) | ||
| + | * Prozesse | ||
| + | * Rechte Maustaste auf dem Header | ||
| + | * Spalten auswählen | ||
| + | * Handles | ||
| + | * Threads | ||
| + | * Seitenfehler | ||
| + | * Server Manager | ||
| + | * " | ||
| + | * Dienste | ||
| + | * Menü " | ||
| + | * Spalten hinzufügen | ||
| + | * es gibt nichts mehr | ||
| + | * PowerShell bietet aber mehr Info dazu (zu den Diensten?) | ||
| + | |||
| + | * PowerShell | ||
| + | * PowerShell-Konsole (CLI=Command Line Interface) | ||
| + | * PowerShell ISE (Integrated Scripting Environment) | ||
| + | * Ausführung in PowerShell muss man explizit einschalten | ||
| + | * auf dem Server ist sie aber standardmäßig an | ||
| + | * Grundlagen | ||
| + | * Batch-Befehle | ||
| + | * WSH = Windows Scripting Host | ||
| + | * PowerShell 1.0 - Nov 2006 (outdated) | ||
| + | * PowerShell 2.0 - Okt 2009 (immer noch aktuell) | ||
| + | * ... | ||
| + | * PowerShell 5.0 - Apr 2014 (Win 10) | ||
| + | * PowerShell MUSS administrativ ausgeführt werden | ||
| + | * sieht man oben im Fenster (" | ||
| + | * starten mit der rechten Maustaste und "Als Administrator ausführen" | ||
| + | * ISE beim ersten Start | ||
| + | * oben " | ||
| + | * IntelliSense | ||
| + | * tut auch in der Console | ||
| + | * mit der Tab Taste | ||
| + | * Parametereingabe (mit '' | ||
| + | * Syntax-Highlighting | ||
| + | * Bei Win 11 die " | ||
| + | * In der PowerShell können auch | ||
| + | * cmd Befehle eingegeben werden | ||
| + | * dir, cls, copy, echo... | ||
| + | * externe Befehle | ||
| + | * e.g. ipconfig, ping ... | ||
| + | * F5 = Skript ausführen | ||
| + | * F8 = nur gewähltes Stück Code (bzw. die Zeile wo der Cursor steht) ausführen | ||
| + | * Normalerweise ISE ist komfortabler als Console | ||
| + | * Console verwenden nur wenn Benutzereingaben erwartet werden | ||
| + | * PowerShell kann einfaches Rechnen: | ||
| + | * Plus, Minus, Modulo ... | ||
| + | * Hex geht auch | ||
| + | * Ergebnis kommt aber dezimal | ||
| + | * Bereiche | ||
| + | * z.B. 1..6 | ||
| + | * PowerShell Cmdlets | ||
| + | * < | ||
| + | * Parameter | ||
| + | * Cmdlet-spezifisch | ||
| + | * Allgemeine | ||
| + | * Verbe: | ||
| + | * Get -> ausgeben | ||
| + | * Set | ||
| + | * Add | ||
| + | * Delete | ||
| + | * Remove | ||
| + | * ... | ||
| + | * Beispiele | ||
| + | * Get-Process | ||
| + | * Prozesse ausgeben | ||
| + | * Get-Command | ||
| + | * Befehle ausgeben | ||
| + | * Get-Service | ||
| + | * Dienste ausgeben | ||
| + | * Parameter | ||
| + | * Benannte | ||
| + | * der Name muss eingegeben werden | ||
| + | * Positionsparameter | ||
| + | * müssen an einer bestimmten Stelle stehen | ||
| + | * Switch-parameter | ||
| + | * braucht keinen Wert | ||
| + | * Beispiel | ||
| + | * '' | ||
| + | * alle Prozesse, die mit '' | ||
| + | * '' | ||
| + | * alle Prozesse, die mit '' | ||
| + | * Get-Cmdlets für den Einstieg (9 Stück) | ||
| + | * Get-ChildItem | ||
| + | * ... | ||
| + | * Get-Date | ||
| + | * Get-History | ||
| + | * History der aktuellen PowerShell-Sitzung | ||
| + | * Get-Module | ||
| + | * Module = Bibliotheken von der PowerShell | ||
| + | * Beispiele | ||
| + | * '' | ||
| + | * Module auflisten, die verfügbar sind | ||
| + | * ohne '' | ||
| + | * Get-NetIPAddress | ||
| + | * aktuelle IP Konfiguration anzeigen | ||
| + | * Get-PSDrive | ||
| + | * aktuelle " | ||
| + | * Laufwerke - NICHT Festplatten, | ||
| + | * Get-PSProvider | ||
| + | * Anbieter der " | ||
| + | * Get-LocalUser | ||
| + | * lokale Benutzer anzeigen | ||
| + | |||
| + | * Hilfesystem der PowerShell (WICHTIG!) | ||
| + | * '' | ||
| + | * Sprachen für die Hilfe installieren | ||
| + | * '' | ||
| + | * Beim ersten Aufruf wird die Hilfe geupdatet (von Microsoft geholt) | ||
| + | * das wird aber nur in der Console gemacht, im ISE geht das leider nicht | ||
| + | * '' | ||
| + | * detaillierte Hilfe für '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * die Online Version (von Microsoft) im Browser anzeigen | ||
| + | * '' | ||
| + | * die Hilfe im speziellen Fenster anzeigen (wo man suchen kann) | ||
| + | * '' | ||
| + | * die Hilfe nicht über ein Befehl sondern über ein Thema anzeigen | ||
| + | |||
| + | ==== Übung " | ||
| + | |||
| + | |||
| + | * 1. Führen Sie Update-Help auf Ihrem System aus. Wie lautet das vollständige Cmdlet, das den sofortigen Download garantiert? | ||
| + | * '' | ||
| + | * '' | ||
| + | * 2. Rufen Sie die Hilfe für das Cmdlet '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * 3. Finden Sie heraus, welche Cmdlets den Parameter –Verb verwenden. Lesen Sie in der Hilfe zu einem der angezeigten Cmdlets nach, was der Parameter bedeutet. | ||
| + | * '' | ||
| + | * 4. Lassen Sie sich Beispiele für das Cmdlet Get-Process anzeigen. | ||
| + | * '' | ||
| + | |||
| + | ==== Übung " | ||
| + | |||
| + | * 1. Finden Sie heraus, welche Befehle das Verb '' | ||
| + | * '' | ||
| + | * 2. Welche Eigenschaften von Diensten auf Ihrem Rechner kann das Cmdlet '' | ||
| + | * '' | ||
| + | * Noch eine Möglichkeit: | ||
| + | * 3. Recherchieren Sie mit den im Kapitel vorgestellten Mitteln | ||
| + | * a) die Syntax des Cmdlets '' | ||
| + | * '' | ||
| + | * b) Beispiele zum Einsatz des Cmdlets Get-PSDrive, | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * c) was der Parameter '' | ||
| + | * '' | ||
| + | * 4. Lesen Sie die vollständigen Hilfetexte zu den vorgestellten Get-Befehlen Get-History, | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * 5. Finden Sie heraus, welche Eigenschaften Ihnen für das Cmdlet Get-Module zur Verfügung stehen | ||
| + | * '' | ||
| + | * bzw. | ||
| + | * '' | ||
| + | |||
| + | |||
| + | ==== 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 " | ||
| + | Get-EventLog -LogName system | Where-Object | ||
| + | |||
| + | #4) | ||
| + | |||
| + | Get-Command -CommandType Cmdlet | Where-Object -Property Verb -eq import | Measure-Object | ||
| + | |||
| + | #5) | ||
| + | |||
| + | Get-ChildItem -Path C:\Windows| ` | ||
| + | Where-Object -FilterScript {$_.Extension -eq " | ||
| + | Sort-Object -Property Length -Descending | ||
| + | |||
| + | Get-ChildItem C: | ||
| + | </ | ||
| + | |||
| + | ==== Vorlesung ==== | ||
| + | |||
| + | * Informationen verarbeiten und ausgeben | ||
| + | * PowerShell Pipeline | ||
| + | * der vorhergehende Befehl gibt die Daten an den nächsten | ||
| + | * Object-Cmdlets | ||
| + | * Formatierung und Ausgabe | ||
| + | * Schrittweise Entwicklung einer Pipeline | ||
| + | * Prinzip der Pipeline | ||
| + | * 1. Daten bereitstellen ('' | ||
| + | * 2. Ergebnis bearbeiten ('' | ||
| + | * 3. Endergebnis ausgeben | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * Verarbeitung vorliegenden Daten | ||
| + | * '' | ||
| + | < | ||
| + | Get-Process -Name a* | Select-Object -Property ProcessName, | ||
| + | |||
| + | # Liste der Properties ausgeben von Get-Process | ||
| + | Get-Process | Get-Member | ||
| + | |||
| + | Get-Process -Name a* | Select-Object -Property Name, id, cpu, threads | ||
| + | </ | ||
| + | |||
| + | * Sort-Object | ||
| + | < | ||
| + | # Nach Id sortieren | ||
| + | Get-Process | Sort-Object -Property Id | ||
| + | |||
| + | # Nach Cpu sortieren | ||
| + | Get-Process | Sort-Object -Property cpu -Descending | ||
| + | </ | ||
| + | |||
| + | * Tee-Object (Ausgabe " | ||
| + | < | ||
| + | # 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 | ||
| + | </ | ||
| + | |||
| + | * Where-Object | ||
| + | * filtert Ausgabe nach definierten Kriterien | ||
| + | * '' | ||
| + | * Where-Object macht " | ||
| + | * '' | ||
| + | |||
| + | < | ||
| + | # 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} | ||
| + | </ | ||
| + | |||
| + | * Select-Object | ||
| + | < | ||
| + | # alle Prozesse anzeigen, die mit ' | ||
| + | Get-Process -Name s* | ||
| + | |||
| + | # alle Prozesse anzeigen, die mit ' | ||
| + | Get-Process -Name s*| Select-Object Unique | ||
| + | </ | ||
| + | |||
| + | * Sort-Object | ||
| + | < | ||
| + | # 50 neueste EventLog Einträge anzeigen, sortiert nach InstanceId | ||
| + | Get-EventLog -LogName System -Newest 50 | Sort-Object -Property InstanceId | ||
| + | </ | ||
| + | |||
| + | * Where-Object | ||
| + | < | ||
| + | # Vereinfachte Syntax (einfacher, kann aber keine UND, ODER etc) | ||
| + | Get-Service | Where-Object Status -EQ Running | ||
| + | |||
| + | # Klassische Syntax | ||
| + | Get-Service | Where-Object {$_.Status -EQ " | ||
| + | |||
| + | Get-Service | Where-Object {$_.Status -EQ " | ||
| + | </ | ||
| + | |||
| + | * Einsatztipps für Pipeline | ||
| + | * So einfach wie möglich gestalten | ||
| + | * ... | ||
| + | |||
| + | * Übung ... | ||
| + | < | ||
| + | # 1 Alle Dienste, die nicht aktiv sind | ||
| + | Get-Service | Where-Object {$_.Status -ne " | ||
| + | |||
| + | # 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 " | ||
| + | </ | ||
| + | |||
| + | * ForEach-Object | ||
| + | < | ||
| + | # jede Ziffer mit 2 multiplizieren | ||
| + | 3,4,5,6,7 | ForEach-Object -Process {$_ * 2} | ||
| + | </ | ||
| + | |||
| + | * Group-Object | ||
| + | * Aggregation | ||
| + | < | ||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | * Measure-Object | ||
| + | * " | ||
| + | < | ||
| + | # 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 | ||
| + | </ | ||
| + | |||
| + | * ForEach | ||
| + | * kann auch | ||
| + | * Begin < | ||
| + | * führt Skript VOR der Schleife aus | ||
| + | * End < | ||
| + | * führt Skript NACH der Schleife aus | ||
| + | |||
| + | * WhatIf | ||
| + | * simuliert den Befehl, führt ihn aber nicht aus (gut zum Testen von " | ||
| + | |||
| + | * Formatierung und Ausgabe | ||
| + | * Out-File | ||
| + | * in eine Datei ausgeben | ||
| + | * Out-GridView | ||
| + | * in eine interaktive(!) Tabelle ausgeben | ||
| + | * Out-Host | ||
| + | * in die Konsole ausgeben | ||
| + | * Out-Null | ||
| + | * auf " | ||
| + | * Out-Printer | ||
| + | * auf einen Drucker ausgeben | ||
| + | |||
| + | * PassThru | ||
| + | * an den nächsten Befehl ausgeben (?) | ||
| + | |||
| + | * Export-Cmdlets | ||
| + | * Export-Clixml | ||
| + | * export als XML | ||
| + | * Export-Csv | ||
| + | * export als CSV | ||
| + | |||
| + | < | ||
| + | Get-Process | Export-Clixml -Path C: | ||
| + | </ | ||
| + | |||
| + | * ConvertTo-Cmdlets | ||
| + | * ähnlich wie Export-Cmdlets, | ||
| + | * ConvertTo-Csv | ||
| + | * ConvertTo-Html | ||
| + | * ConvertTo-SecureString | ||
| + | * Kennwörter speichern | ||
| + | ==== Übung 4 ==== | ||
| + | |||
| + | Meine Lösung: | ||
| + | |||
| + | < | ||
| + | # 1 | ||
| + | Get-Service -Name s* | Where-Object {$_.Status -eq " | ||
| + | |||
| + | # 2 | ||
| + | Get-ChildItem C:\Windows -File| Sort-Object Length -Descending | Export-Csv -Path C: | ||
| + | |||
| + | # 3 | ||
| + | Get-Process | Export-Csv -Path C: | ||
| + | Get-Process | Export-Csv -Path C: | ||
| + | Get-Process | Export-Csv -Path C: | ||
| + | |||
| + | # 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 " | ||
| + | |||
| + | # 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, | ||
| + | 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: | ||
| + | # Alternative | ||
| + | Get-ChildItem -Path C:\Windows | Where-Object {$_.Extension -EQ " | ||
| + | |||
| + | # 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 " | ||
| + | |||
| + | |||
| + | ===== Tag 4: 13.02.2025 Donnerstag ===== | ||
| + | |||
| + | ==== Vorlesung ==== | ||
| + | |||
| + | * Wildcards in den Parametern nicht immer möglich | ||
| + | * => im Einzelfall Dokumentation prüfen | ||
| + | * '' | ||
| + | * '' | ||
| + | * Datenspeicher in der PowerShell | ||
| + | * RAM | ||
| + | * Festplatte | ||
| + | * DB | ||
| + | * ... | ||
| + | |||
| + | * PowerShell Provider | ||
| + | * Alias | ||
| + | * Environment | ||
| + | * FileSystem | ||
| + | * Function | ||
| + | * Variable | ||
| + | * ... | ||
| + | * Get-PSProvider | ||
| + | * die verfügbaren Provider auflisten | ||
| + | < | ||
| + | # alle auflisten | ||
| + | Get-PSProvider | ||
| + | |||
| + | # Info über PSProvider " | ||
| + | Get-PSProvider -PSProvider Registry | ||
| + | </ | ||
| + | |||
| + | * PowerShell Laufwerke (PSDrive) | ||
| + | * '' | ||
| + | * anzeigen | ||
| + | < | ||
| + | Get-PSDrive -Name Daten | ||
| + | |||
| + | # alle properties anzeigen | ||
| + | Get-PSDrive -Name Daten | Select-Object -Property * | ||
| + | </ | ||
| + | * '' | ||
| + | * anlegen | ||
| + | * '' | ||
| + | * löschen | ||
| + | |||
| + | < | ||
| + | # Verzeichnis C: | ||
| + | New-PSDrive -PSProvider FileSystem -Name prv -Root C: | ||
| + | |||
| + | # ins prv wechseln | ||
| + | Set-Location prv: | ||
| + | |||
| + | # Prozesse in die Datei .\prozesse.txt schreiben | ||
| + | Get-Process | Set-Content .\prozesse.txt | ||
| + | </ | ||
| + | |||
| + | * Löschen | ||
| + | * man kann nicht löschen, wenn man drin ist | ||
| + | * das kann man mit dem Parameter '' | ||
| + | |||
| + | * Cmdlets für die Arbeit mit Verzeichnissen | ||
| + | * Get-Location | ||
| + | * Set-Location | ||
| + | * Push-Location | ||
| + | * Pop-Location (?) | ||
| + | |||
| + | * Set-Location | ||
| + | < | ||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | * Push-Location | ||
| + | * speichert aktuelle Location auf dem Stack | ||
| + | * Pop-Location | ||
| + | * eine Position im Stack hoch | ||
| + | * => die oberste Location löschen | ||
| + | * => man landet in der vorherigen | ||
| + | * => wenn Stack leer -> in der aktuellen bleiben | ||
| + | |||
| + | * Cmdlets für die Arbeit mit Elementen und ihren Eigenschaften | ||
| + | * Clear-Item | ||
| + | * löscht Inhalt(!) eines Elements | ||
| + | * Clear-ItemProperty | ||
| + | * löscht den Wert(!) einer Property vom Element | ||
| + | * Copy-Item | ||
| + | * Element kopieren | ||
| + | * Copy-ItemProperty | ||
| + | * Property eines Elements kopieren | ||
| + | * Get-Item | ||
| + | * Ruft Infos eines Elements ab | ||
| + | * Get-ItemProperty | ||
| + | * Ruft den Wert einer Property ab | ||
| + | * Invoke-Item | ||
| + | * Standardaktion festlegen | ||
| + | * Move-Item | ||
| + | * Verschieben eines Elements (z.B. einer Datei) | ||
| + | * Move-ItemProperty | ||
| + | * verschieben einer Property | ||
| + | * sinnvoll z.B. bei Registry Schlüsseln | ||
| + | * New-Item | ||
| + | * Items erstellen (Dateien, Registry Elemente etc.) | ||
| + | * New-ItemProperty | ||
| + | * Remove-Item | ||
| + | * Remove-ItemProperty | ||
| + | * Rename-Item | ||
| + | * Rename-ItemProperty | ||
| + | * Set-Item | ||
| + | * dem Element einen neuen Wert zuweisen | ||
| + | * funktioniert nicht immer (z.B. es funktioniert nicht bei Dateien) | ||
| + | * Set-ItemProperty | ||
| + | * ... | ||
| + | |||
| + | < | ||
| + | Copy-Item -Path C: | ||
| + | |||
| + | # Rekursiv: | ||
| + | Copy-Item -Path C: | ||
| + | |||
| + | Get-ChildItem -Path C:\Test -Include *.tmp | Remove-Item | ||
| + | |||
| + | Get-ItemProperty -Path C:\test.txt | Select-Object -Property * | ||
| + | |||
| + | # Property " | ||
| + | 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)) | ||
| + | |||
| + | </ | ||
| + | |||
| + | * Laufwerke im Dateisystem | ||
| + | * Add-Content | ||
| + | * Content zur Datei hinzufügen | ||
| + | * Create-Content | ||
| + | * Content der Datei setzen (erstellen) | ||
| + | * Get-Content | ||
| + | * Content der Datei abrufen | ||
| + | * Set-Content | ||
| + | * Content der Datei setzen | ||
| + | |||
| + | < | ||
| + | # (wenn Datei existiert wird sie überschrieben) | ||
| + | Get-Process -Name a* | Set-Content -Path C: | ||
| + | |||
| + | # die ersten 2 Zeilen der *.txt Dateien ausgeben | ||
| + | Get-ChildItem -Path C:\*.txt -Recurse | Get-Content -TotalCount 2 | ||
| + | |||
| + | # in die Datei notiz.txt Text " | ||
| + | Set-Content -Path .\notiz.txt -Value " | ||
| + | </ | ||
| + | |||
| + | * N.B. Der Parameter '' | ||
| + | * wichtig z.B. bei GridView | ||
| + | |||
| + | * Registry Laufwerke | ||
| + | * 2 Laufwerke | ||
| + | * HKCU | ||
| + | * HKEY_CURRENT_USER | ||
| + | * HKLM | ||
| + | * HKEY_LOCAL_MACHINE | ||
| + | < | ||
| + | Set-Location -Path HKLM: | ||
| + | |||
| + | # Neues Verzeichnis dort (in der Registry) erstellen | ||
| + | # Type " | ||
| + | New-Item -Path " | ||
| + | |||
| + | New-ItemProperty -Path " | ||
| + | |||
| + | # man kann auch Hex-Werte anlegen | ||
| + | New-ItemProperty -Path " | ||
| + | </ | ||
| + | |||
| + | * Set-ItemProperty | ||
| + | * Werte ändern | ||
| + | * Remove-ItemProperty | ||
| + | * Werte löschen | ||
| + | |||
| + | * Laufwerk für Umgebungsvariablen (Provider Environment) | ||
| + | |||
| + | < | ||
| + | Get-ChildItem -Path Env:\ | ||
| + | </ | ||
| + | |||
| + | * händisch kann man die Umgebungsvariablen unter " | ||
| + | |||
| + | * '' | ||
| + | * Variablen addressieren | ||
| + | * '' | ||
| + | * z.B. '' | ||
| + | |||
| + | * Aliase | ||
| + | * Abkürzungen für Befehle | ||
| + | * 2 Arten | ||
| + | * eingebaut | ||
| + | * User-definiert | ||
| + | * es gibt einen Provider '' | ||
| + | |||
| + | < | ||
| + | # in die Location alias: wechseln | ||
| + | Set-Location alias: | ||
| + | |||
| + | # Alle Aliase auflisten | ||
| + | Get-ChildItem | ||
| + | |||
| + | # alle auflisten | ||
| + | Get-Alias | ||
| + | |||
| + | # alle wo der Befehl " | ||
| + | Get-Alias -Definition MyCmd | ||
| + | </ | ||
| + | |||
| + | * Eigene Aliase definieren | ||
| + | * Set-Alias | ||
| + | * einen neuen oder vorhandenen definieren | ||
| + | * New-Alias | ||
| + | * einen neuen definieren | ||
| + | * wenn existiert -> Fehler | ||
| + | |||
| + | * Export / Import von Aliasen | ||
| + | * die Aliase sind nur für die aktuelle Sitzung gültig deshalb macht es Sinn sie zu exportieren / importieren | ||
| + | |||
| + | < | ||
| + | # 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 | ||
| + | |||
| + | </ | ||
| + | |||
| + | * Aliase entfernen | ||
| + | * Remove-Item | ||
| + | |||
| + | < | ||
| + | Remove-Item -Path alias: | ||
| + | </ | ||
| + | |||
| + | ==== Übung 5.9 (Seite 78) ==== | ||
| + | < | ||
| + | # 1 | ||
| + | Get-PSDrive -PSProvider FileSystem | ||
| + | |||
| + | # 2 a) | ||
| + | New-Item -Path C: | ||
| + | |||
| + | # Alternativ | ||
| + | # mkdir C: | ||
| + | |||
| + | # 2 b) | ||
| + | New-PSDrive -PSProvider FileSystem -Name Testdaten -Root C: | ||
| + | |||
| + | # 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 " | ||
| + | |||
| + | # 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: | ||
| + | |||
| + | # 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 " | ||
| + | Remove-PSDrive Testdaten | ||
| + | # wird nicht direkt funktionieren, | ||
| + | # => also zuerst auf ein anderes Laufwerk wechseln (z.B. mit " | ||
| + | # 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 " | ||
| + | New-Alias -Name " | ||
| + | New-Alias -Name " | ||
| + | |||
| + | # Macht es einen Unterschied, | ||
| + | # 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 " | ||
| + | |||
| + | # 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 ==== | ||
| + | * " | ||
| + | * Wir machen weiter mit " | ||
| + | |||
| + | * Variablen | ||
| + | * Speicher -> Variable | ||
| + | |||
| + | < | ||
| + | Get-PSDrive | ||
| + | cd variable: | ||
| + | </ | ||
| + | |||
| + | * Einstellungsvariablen | ||
| + | * Speichern Einstellungen der PowerShell | ||
| + | * z.B. '' | ||
| + | |||
| + | < | ||
| + | # Ausgabe einer Variable | ||
| + | $HOME | ||
| + | C: | ||
| + | </ | ||
| + | |||
| + | * Automatische Variablen | ||
| + | * haben ihre Werte abhängig von der " | ||
| + | * z.B. $HOME ist abhängig vom angemeldeten Benutzer | ||
| + | * $? | ||
| + | * $Error | ||
| + | * Benutzerdefinierte Variablen | ||
| + | * New-Variable | ||
| + | * erstellen einer Variable | ||
| + | * $null -> Default-Wert einer Variable wenn nichts zugewiesen | ||
| + | < | ||
| + | New-Variable -Name myVar -Value 123 | ||
| + | </ | ||
| + | * Set-Variable | ||
| + | * Clear-Variable | ||
| + | * Remove-Variable | ||
| + | |||
| + | < | ||
| + | New-Variable -Name zahl1 | ||
| + | New-Variable -Name zahl2 -Value 200 | ||
| + | New-Variable -Name text1 -Value " | ||
| + | |||
| + | # 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" | ||
| + | |||
| + | </ | ||
| + | |||
| + | * Eigene Variablen sind flüchtig | ||
| + | * => sie gelten nur für die aktuelle Session | ||
| + | * Bei Set-Value | ||
| + | * 37 * 11 | ||
| + | * => Fehler, da als 3 Parameter interpretiert wird | ||
| + | * 37*11 | ||
| + | * => Fehler, da als Zeichenkette interpretiert wird | ||
| + | * (37*11) | ||
| + | * => Ergebnis ist 407 | ||
| + | * also wenn rechnen notwendig ist => in Klammern setzen | ||
| + | * aber bei der " | ||
| + | |||
| + | * Anderes Beispiel | ||
| + | < | ||
| + | # aktuelles Datum speichern | ||
| + | $datum1 = Get-Date | ||
| + | |||
| + | # Zeichenkette " | ||
| + | New-Variable -Name datum1 -Value Get-Date | ||
| + | |||
| + | # Datum drin (wg. Klammern) | ||
| + | New-Variable -Name datum1 -Value (Get-Date) | ||
| + | </ | ||
| + | |||
| + | * Variablentypen (aus .NET genommen) | ||
| + | * int | ||
| + | * long | ||
| + | * string (Unicode) | ||
| + | * char (Unicode => 16bit) | ||
| + | * bool | ||
| + | * decimal | ||
| + | * ... | ||
| + | * Byte | ||
| + | * -127 bis +127 | ||
| + | * wg. 1 bit => Vorzeichen | ||
| + | |||
| + | < | ||
| + | # Type explizit definieren | ||
| + | [int] $zahl5=200 | ||
| + | |||
| + | # geht nicht wg. Typeverletzung | ||
| + | $zahl5 = " | ||
| + | </ | ||
| + | |||
| + | * N.B. In diesem Kurs wird aber keine Typenbindung verwendet | ||
| + | |||
| + | < | ||
| + | # array | ||
| + | $zahlen=1, | ||
| + | |||
| + | # 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 * | ||
| + | |||
| + | </ | ||
| + | |||
| + | * Konstanten | ||
| + | |||
| + | < | ||
| + | New-Variable -Name MyConst -Value 3.1415 -Option Constant | ||
| + | </ | ||
| + | |||
| + | * Variablen auf dem Bildschirm ausgeben | ||
| + | |||
| + | < | ||
| + | # Mit double quotes wird die Variablenauflösung gemacht | ||
| + | Write-Host " | ||
| + | |||
| + | # Mit single quotes wird KEINE Variablenauflösung gemacht | ||
| + | Write-Host ' | ||
| + | </ | ||
| + | |||
| + | * Arithmetische Operationen | ||
| + | * +, -, *, /, %, ++, --, +=, -=, *=, /= | ||
| + | * N.B. zu " | ||
| + | * $a += $b | ||
| + | * ist dasgleiche wie | ||
| + | * $a = $a + $b | ||
| + | * Vergleichsoperatoren | ||
| + | * -eq, -ne, -gt, -ge, -lt, -le, -Contains, -NotContains | ||
| + | * Textvergleiche sind nicht Case-sensitive | ||
| + | * " | ||
| + | * => liefert TRUE | ||
| + | * case-sensitive Vergleiche | ||
| + | * -ceq, -cne, ... | ||
| + | * " | ||
| + | * => liefert FALSE | ||
| + | * (-ceq ist case-sensitive variante von -eq) | ||
| + | * -Contains, -NotContains | ||
| + | * prüft ob im Array(!) ein Wert vorkommt / nicht vorkommt | ||
| + | * -In, -NotIn | ||
| + | * Contains, aber " | ||
| + | < | ||
| + | " | ||
| + | </ | ||
| + | |||
| + | * -Is / -IsNot | ||
| + | * Prüfung auf Typgleichheit | ||
| + | * -Like / -NotLike | ||
| + | * Mustervergleich (mit Wildcards) | ||
| + | * -Match / -NotMatch | ||
| + | * Mustervergleich OHNE Wildcards (aber RegExes möglich) | ||
| + | * TypeOf / GetType (<- Functions) | ||
| + | * '' | ||
| + | |||
| + | * Logische Operatoren | ||
| + | * -and, -or, -xor, -not ... | ||
| + | |||
| + | |||
| + | * Kontrollstrukturen in der PowerShell | ||
| + | ... | ||
| + | |||
| + | |||
| + | * Kontrollstrukturen in der PowerShell | ||
| + | * If - Anweisung | ||
| + | < | ||
| + | If($x -eq 27) | ||
| + | { | ||
| + | Write-Host "Der Wert der Variable x ist gleich 27" | ||
| + | } | ||
| + | </ | ||
| + | * If/Else - Anweisung | ||
| + | < | ||
| + | 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" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | * Beispiel | ||
| + | < | ||
| + | $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/ElseIf - Anweisung | ||
| + | |||
| + | < | ||
| + | if($x -eq 27) | ||
| + | { | ||
| + | Write-Host "Der Wert ist 27" | ||
| + | } | ||
| + | </ | ||
| + | * If/Else | ||
| + | * If/IfElse | ||
| + | * If / IfElse / Else | ||
| + | * Switch | ||
| + | < | ||
| + | switch ($variable) | ||
| + | { | ||
| + | Wert1 { | ||
| + | # block1 | ||
| + | } | ||
| + | Wert2 { | ||
| + | # block1 | ||
| + | } | ||
| + | default { | ||
| + | # default block | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * Schleifen | ||
| + | * While | ||
| + | * Do-While | ||
| + | * Do-Until | ||
| + | * wiederholen solange die Bedingung FALSE ist | ||
| + | * For | ||
| + | < | ||
| + | for($a=1;$a -le 5; $a++) | ||
| + | { | ||
| + | # ... | ||
| + | } | ||
| + | </ | ||
| + | * ForEach | ||
| + | < | ||
| + | $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 | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * Anweisungen zur Ablaufsteuerung | ||
| + | * break | ||
| + | * Schleife komplett beenden | ||
| + | * continue | ||
| + | * den aktuellen Durchlauf beenden | ||
| + | ==== Ü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" | ||
| + | |||
| + | $c_euro | ||
| + | |||
| + | # d) Lassen Sie den Satz "Ich habe x Euro in meiner Geldbörse." | ||
| + | |||
| + | "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 " | ||
| + | # Groß- und Kleinschreibung). | ||
| + | " | ||
| + | |||
| + | " | ||
| + | |||
| + | |||
| + | # 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 " | ||
| + | # alternative | ||
| + | $HOME -Like " | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== Ü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, | ||
| + | # 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 { | ||
| + | " | ||
| + | } | ||
| + | 3 { | ||
| + | " | ||
| + | } | ||
| + | 4 { | ||
| + | " | ||
| + | } | ||
| + | 5 { | ||
| + | " | ||
| + | } | ||
| + | 6 { | ||
| + | " | ||
| + | } | ||
| + | default { | ||
| + | "Diese Note ist nicht bekannt" | ||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | # 3. Programmieren Sie eine Schleife, die die Werte 10 bis 100 in Zehnerschritten ausgibt. | ||
| + | |||
| + | For($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" | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | #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 | ||
| + | " | ||
| + | " | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | #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 " | ||
| + | $HOME -like " | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | #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) | ||
| + | { | ||
| + | | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | #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) | ||
| + | { | ||
| + | | ||
| + | } | ||
| + | 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) | ||
| + | { | ||
| + | | ||
| + | } | ||
| + | elseif($wert -eq 5) | ||
| + | { | ||
| + | Write-Host " Der Wert der Variablen ist $wert und ist gleich 5" | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | #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" | ||
| + | | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | #6. Erstellung einer Schleife welche die Werte von 10 bis 100 in 10er Schritten ausgibt | ||
| + | $zaehler = 10 | ||
| + | while($zaehler -le 100) | ||
| + | { | ||
| + | | ||
| + | | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | #7. Alle Vielfachen der Zahl 5 bis 100 ausgeben mit einer For Schleife | ||
| + | for($zaehler = 5; $zaehler -le 100; $zaehler = $zaehler + 5) | ||
| + | { | ||
| + | | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | ==== Übung 8 (Von Michael als " | ||
| + | |||
| + | 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=" | ||
| + | |||
| + | cd $myPath | ||
| + | |||
| + | If((Test-Path -Path " | ||
| + | { | ||
| + | " | ||
| + | |||
| + | cd " | ||
| + | $children = (Get-ChildItem) | ||
| + | ForEach($currentChild in $children) { | ||
| + | Remove-Item $currentChild | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | " | ||
| + | | ||
| + | mkdir TestVZ | ||
| + | #New-Item -Name " | ||
| + | } | ||
| + | |||
| + | |||
| + | # Legen Sie 20 Dateien mit dem Namen " | ||
| + | # wobei x durch die Zahlen 1 bis 20 ersetzt wird | ||
| + | |||
| + | cd " | ||
| + | |||
| + | 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 " | ||
| + | |||
| + | 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 " | ||
| + | $day = Get-Date | Get-Member -MemberType day | ||
| + | if() | ||
| + | |||
| + | # Ermitteln Sie den Wert des Attributes " | ||
| + | # 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 " | ||
| + | </ | ||
| + | |||
| + | 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: | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | for($i=1; $i -le 20; $i++) | ||
| + | { | ||
| + | New-Item -ItemType File -Path C:\TestVZ -name " | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | $Datum = (get-date).Day | ||
| + | if($Datum -lt 16) | ||
| + | { | ||
| + | Get-Process | out-file -FilePath C: | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | Get-Service | Out-File -FilePath C: | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | $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: | ||
| + | } | ||
| + | |||
| + | $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 " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | else | ||
| + | { | ||
| + | Write-Host "Platz auf dem Datenträger nicht ausreichend" | ||
| + | } | ||
| + | </ | ||
