C:\VMC:\VM—
C:\VM)—
-)Get-Process -Name a*a anfangen anzeigenGet-Process -Name a*, se*a ODER se anfangen anzeigenGet-Module -ListAvailable-ListAvailable werden nur die aktiven angezeigtGet-HelpUpdate-Help -UICulture “en-US”Get-Help Get-Process -DetailedGet-Process anzeigenGet-Help Get-Process -ExamplesGet-Help Get-Process -FullGet-Help Get-Process -OnlineGet-Help Get-Process -ShowWindowGet-Help about-<Topic>Update-Help bzw.Update-Help -UICulture “de-DE” (für Deutsch)Get-Service auf. Vergleichen Sie die Ausgabe, wenn Sie keine weiteren Parameter angeben, mit der Ausgabe, die Sie jeweils bei zusätzlicher Eingabe des Parameters –Detailed, –Full bzw. –Examples erhalten.Get-Help Get-Service -DetailedGet-Help Get-Service -FullGet-Help Get-Service -ExamplesGet-Help -Name * -Parameter VerbGet-Help Get-Process -ExamplesImport verwendet.Get-Help -Name Import*Get-Service anzeigen?Get-Service | Get-MemberGet-Help GetService) und nachschauen was alles dort stehtGet-Module,Get-Help Get-Module -OnlineGet-Help Get-PSDrive -ExamplesGet-Help Get-PSDrive -Examples -Online → funktioniert NICHT!Get-Help Get-PSDrive -Examples -ShowWindow → funktioniert NICHT!–Format des Cmdlets Get-Date bedeutet.Get-Help Get-Date -Parameter Format -Online → funktioniert NICHT!Get-Help Get-History -FullGet-Help Get-Process -FullGet-Help Get-PSProvider -FullGet-Help Get-Module -OnlineGet-Module | Get-Member# Ü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
#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
Get-…)…-Object)Export-…Format-…Out-…Select-ObjectGet-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
{} - Process Block $_ → aktuelles Element# 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
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 $_}
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).
Where-Object = Where (über Alias?)Export-Csv kann man auch mit ConvertTo-Csv und dann Out-File implementieren# alle auflisten Get-PSProvider # Info über PSProvider "Registry" Get-PSProvider -PSProvider Registry
Get-PSDriveGet-PSDrive -Name Daten # alle properties anzeigen Get-PSDrive -Name Daten | Select-Object -Property *
New-PSDriveRemove-PSDrive# 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
-Force umgehenSet-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!"
-PassThru gibt die Ergebnisse an den nächste BefehlSet-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:\
Env: hat keine Hierarchie, alle Variablen sind direkt in Env:$env:<VariablenName>$env:PATH oder $env:computernameAlias# 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
# 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
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
Get-PSDrive cd variable:
$MaximumAliasCount oder $MaximumHistoryCount# 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
}
# 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*"
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
}
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
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"
}