PowerShell Referenz
PowerShell Referenz
[Link]
PowerShell-Referenz
PowerShell-Grundlagen
Elementares Kommandos
Gro- und Kleinschreibung sind beliebig! Get-Alias Alias-Namen anzeigen
Cursortasten: letzte Befehle anzeigen/bearbeiten Get-ChildItem Directory-Listing
[Tab] Befehl/Dateinamen/Optionen ergnzen Show-Command Get-Process Kommandos mit grafischem Frontend
^C Abbruch von laufenden Programmen Get-EventLog -logname application -newest 10
` Zeilenumbruch entwerten (Accent Grve!) Neueste 10 Ereignisse anzeigen lassen
[ret][ret] Abschluss fr manuelle Texteingabe Get-Service Alle Dienste anzeigen
; Befehlstrenner Get-Process Alle Prozesse anzeigen
Get-History Letzten Befehle anzeigen Get-PSSnapin Powershell-Erweiterungen anzeigen
F7 Pop-Up: Befehl wiederholen Start-Sleep -m 500 500 ms Pause
Hilfen [intptr]::size * 8 Zeigt Anzahl Bits fr Integer an
Get-Alias -? Hilfe zum CmdLet Get-Alias Objekt-Zugriff
Get-Help Get-Alias -Det Detaillierte Hilfe zum CmdLet Get-Alias Get-Member Methoden + Eigenschaften anzeigen ("gm")
Get-Help * Zeigt alle Hilfethemen an. Bsp.: Get-Date | gm *
-detailed Erweiterte Anzeige mit Beispielen Format-List * Alle Eigenschaften anzeigen (fl")
-full Komplette technische Hilfe Bsp.: Get-Date | fl *
Get-Help *Objekt* Zeigt Themen mit "Objekt" im Namen $_. Zugriff auf aktuelles Objekt (foreach, where)
Get-Help about* Hilfe zu Powershell-Anweisungen (Get-Host).privatedata Zugriff auf Eigenschaften eines Objekts
Get-Help about_wildcard Hilfe zu Wildcards (get-host).[Link]="yellow"
Get-Help about_commonparameters Fehlerbehandlung etc. (Get-Host).GetType() Zugriff auf Methoden enes Objekts
z.B. ErrorAction SilentlyContinue (Get-Process).count Anzahl Objekte ermitteln
Update-Help Hilfedateien aktualisieren [DateTime]::Now Statischer Zugriff, [DateTime]::IsLeapYear(2012)
Informationen zu Kommandos: Variablen
Get-Command *process* Alle mit "process" im Namen $a = "Stefan Menne" Variable neu anlegen
Get-Alias * Alias-Namen zeigen ("get-alias g*") $a Variable anzeigen
Internet-Tipps: $b = Get-Process Kommandoausgabe speichern
[Link]/Powershell Microsoft Entwickler [int] $a = 32 Typvorgabe
Terminal ($a).Length Lnge ausgeben
$a,$b,$c = 1,2,3 Mehrfach-Zuweisung
Clear-Host Terminal lschen
$nn,$vn = "Stefan;Menne".split(";") Mehrfach-Zuweisung mit Split()
Get-Host Infos anzeigen
$a,$b = $b,$a Inhaltstausch
Start-Transcript Bildschirmprotokoll anfertigen
Set-Variable -name pi -value 3.1415 -option constant Konstante
Stop-Transcript Stoppen des Bildschirmprotokolls
Set-Variable -name euro -value 1.382 -option readonly Nur Lesen
Ausgabe Zugriff auf verbundene Variablen:
Write-Host "Text" Bildschirmausgabe, Optionen: Get-EventLog System | % { "$($_.EntryType) : $($_.Message)" }
-ForegroundColor green -BackgroundColor red -NoNewline Automatische Variablen:
Farben: Black,Gray,Blue,Green,Cyan,Red,Magenta,Yellow,White, DarkRed, $$ Letztes Token der letzten Kommandozeile
Write-Output Einfache Textausgabe, Aliase: echo, write $? Return-Code des letzten Kommandos
Write-Error Text als Fehler ausgeben $^ Erstes Token der letzten Kommandozeile: i.A. Kommando
Get-Content Inhalt einer Datei ausgeben $_ Aktuelles Pipeline-Objekt
Format-Table Tabellarisch anzeigen , Option: -AutoSize $Args Argumente des Scripts
Format-List Zeilenweise Eigenschaften anzeigen (fl) Variablen zur Programmierung:
Format-Wide -column 2 Mehrspaltige Ausgabe $true Boolean WAHR
Out-GridView Grafische Anzeige $false Boolean FALSCH
Out-Host -Paging In einer Pipe: Seitenweises Anzeigen Test-Path Variable:xxx Existenz testen
Out-File [Link] Ausgabe in Datei speichern (-Append) $null "nichts", also ein NULL-Objekt (zum Lschen von Objekten)
Out-Printer Direktes Ausdrucken $OFS Trennzchn fr Konvert. von Arrays zu String (Default: space)
Sonder-Codes: (Wie Unix \)
Arrays
`' -- Single quote `" -- Double quote `0 -- Null
@() Leeres Array
`a -- Alert `b -- Backspace `f -- Form feed
@(7) Array mit einem Element
`n -- New line `r -- Carriage return `t -- Horizontal tab
@(1..50) Array mit 50 Elementen
Bsp: Write-Host "Zeilen`numbruch`$alpha"
$a = 1, 'zwei', 'drei', 4 Array definieren
Konvertierung von Pipe-Daten:
$a[2] Array-Element anzeigen
ConvertTo-Html Ausgeben als HTML
$a[0..2] Mehrere El. anzeigen, $a[-2..-1]
ConvertTo-SecureString Verschlsselt ausgeben
$[Link] Anzahl Elemente
Export-Csv Ausgeben als CSV
$b=@(Get-Process) Array mit Prozessen erstellen
Export-Clixml Ausgeben als XML
$c=$a + $b Zwei Arrays zusammenfgen
Here-Scripte: $a =@" $a =@
Assoziative Arrays: {..}
Ein langer Text langer Text
$a = @{} Leeres assoziatives Array
mit $(3+4) ohne Variablen
$a+=@{Anton = 1} Element hinzufgen
"@ @
@{Autos=3; Kinder=5} assoziatives Array definieren
Ausgaben-Umlenkung $a=[ordered]@{Huser=2; Autos=7; Kinder=3}
Kanle: * Alles, 1=stdout, 2=stderr, 3=Warnung, 4=Verbose, 5=Debug Sortiertes Array erzeugen
1> datei stdout in Datei Dateiverarbeitung:
1>> datei stdout an Datei anhngen Daten-Datei "[Link]":
2> datei stderr umlenken sorglos;Sorglos;Susanne
5>&1 Debugmeldungen mit ausgeben
wolters;Wolters;Willi
Befehlssubstitution:
Powershell-Script:
$(cmd) z.B. Stop-Process $(ps | ? {$_.Name -match "fox" })
foreach ($User in Get-Content "[Link]") {
Datumsberechnungen
$LoginName, $Name, $Vorname = $[Link](;)
Get-Date -uformat "%Y-%m-%d" Unix-Formatierung write-host "'$LoginName': $Vorname $Nachname"
(Get-Date).AddDays(100) Tage addieren }
(Get-Date -date "2010-3-12").AddDays(200) Tage nach einem Datum
CSV-Datei "[Link]":
((Get-Date -date "1989-09-26").AddYears(30)).DayOfWeek Wochentag
((Get-Date -date "2038-01-01") - (Get-Date "0:00")).Days Differenz Logname,Nachname,Vorname,Funktion
Freigaben sorglos,Sorglos,Susanne,Dozent
wolters,Wolters,Willi,Studierender
Freigaben:
New-Item C:\Public" type directory Powershell-Script:
New-SmbShare -FullAccess "Jeder" -name Public -path "C:\Public" foreach($i in Import-Csv "[Link]" ) { echo $[Link] }
Get-SmbShare Freigaben anzeigen # oder:
Get-SmbShareAccess Public Rechte abrufen Import-Csv .\[Link] | % { $_.Nachname }
Profile
$Profile Autostart-Datei fr PS (auch PS-ISE)
notepad $Profile Profile-Datei bearbeiten
Tools Verschiedenes
Powershell-Tools Provider
Select-Object (Alias: "select") Provider-Arten:
[-property] ID,Name Eigenschaften auswhlen Get-PSProvider Alle Provider anzeigen (Drives beachten!)
-first 7 die ersten 7 Datenstze Get-PSDrive Anzeige aller Laufwerke
-last 12 die letzten 12 Datenstze Bsp: cd HKLM: In Registry-Ordner HKLM wechseln
-unique gleiche Datenstze unterdrcken New-PSDrive -Name remote PSProvider FileSystem Root \\ds\doz
Bsp: get-Process | Select-Object -property ws,cpu,name -first 5 Neues Laufwerk remote: erzeugen (statt: net use Z: \\ds\doz)
@{Name= "Zeit"; Expression= {$_.Cpu} } Eigene Spalten Remove-PSDrive remote Laufwerk entfernen
Bsp: ls | Select Name, @{ N="Datum";E={ $_.LastWriteTime} }, Item-Tools:
@{ N="Alter";E={ ((Get-Date) - $_.CreationTime).Days} } Ein Item kann ein Verzeichnis, Registry-Eintrag, Variable, Active-Directory-
Sort-Object (Alias: "sort") Eintrag oder Datei sein.
[-property] Name Sortierung nach der Eigenschaft Get-Item . Aktuelles Objekt holen/anzeigen
-unique gleiche Datenstze unterdrcken Get-ChildItem . Items des auflisten (-Recurse)
-descending absteigend sortieren Get-ItemProperty . Eigenschaften vom akt. Obj. abrufen
-caseSensitive Gro-/Kleinschreibung beachten! New-Item -path H:\ -name [Link] -type file -value Inhalt
Bsp: get-childitem | sort-object -property length -descending Item Objekt anlegen
Measure-Object Set-Item Existierendes Objekt mit Wert belegen
-property Clear-Item Inhalt lschen
-average|sum|minimum|maximum Zahlen Weitere Befehle: Copy-Item, Remove-Item, Rename-Item, Move-Item
-line|word|character Text Location-Befehle:
Bsp: get-childitem | measure-object -property length -min -max -av Get-Location Aktuellen Ort anzeigen
Where-Object (Alias: "?", where) Set-Location Ort wechseln
Bsp: get-service | where-object { $_.Status -eq "Stopped"} Push-Location Aktuellen Ort in Stack speichern
get-process | where {$_.ws -gt 10MB -and $_.cpu ge 10} Pop-Location Zum letzten Ort aus dem Stack wechseln
Zugriff auf Systemumgebungen
Falls nur 3 Parameter ntig sind: .NET:
get-process | where Workingset -gt 10MB $web = new-object [Link] (ca. 12 Klassen relevant)
Foreach-Object (Alias: "%", foreach) $[Link]([Link] d:\[Link])
Bsp: @(30,40,80,200) | ForEach-Object { $_ / 10 } (Auch: Invoke-WebRequest [Link]
400,600,800,100 | ForEach-Object { [Console]::Beep($_,200) } $d = New-Object -Type [Link] 2019,9,26
ls c:\ | % { $d.get_DayOfWeek()
$n+=1 [Math]::Pi [Math]::Sin(x)
Write-Host "$n : $($_.name)" COM:
} $obj = New-Object -comobject "[Link]"
Foreach-Anweisung: (siehe unter: Schleifen, S.4) $[Link]
foreach ($i in Get-Process) { $i} WMI:
Operatoren Get-WmiObject -List
Standard-Operatoren: Get-WmiObject -List | ? {$_.Name -match "Share"}
+ - * / % = += -= *= /= %= ++ -- Get-WmiObject win32_bios
Vergleiche: Get-WmiObject win32_service -computername [Link] | ft
-eq ( == ) -ne ( != ) -gt ( > ) -ge ( >= ) -lt ( < ) -le ( <= ) Dialogboxen
42 is [int] Typ-Vergleich $x=[[Link]]::LoadWithPartialName("[Link]")
42 as [string] Typ-Konvertierung [[Link]]::Show("Meldung", Ueberschrift,
String-Vergleiche: Buttons, Art)
lauf match [abc] (-notmatch) Buttons: Rckgabwerte:
Stefan like S* (-notlike) 0 = OK 0 = nichts gedr. 4 = Retry
2,3,4 contains 3 (-notcontains) 1 = OK, Abbrechen 1 = Ok 5 = Ignore
2 = Abbrechen, Wiederholen, OK 2 = Cancel 6 = Yes
Berta in Anton,Berta,Claus (-notin) 3 = Ja, Nein, Abbrechen 3 = Abort 7 = No
Logische Operatoren: 4 = Ja, Nein
-and -or -not -xor ! 5 = Wiederholen, Abbrechen
Formatierung der Ausgabe Symbol Werte:
Formatierung mit f: { index[,alignment][:formatString]} K04_13 Frage 32 K04_15 Warnung 48
Bsp: "{0,-10}" Parameter 0: 10 Stellen linksbndig K04_14 Fehler/Stopp 16 K04_16 Info 64
"{0,20} Parameter 0: 20 Stellen rechtsbndig Zugriffsrechte ACL
"{0,10:N2}" Zahl mit 10 Stellen, 2 Nachkomma $Datei = "C:\[Link]" Datei muss existieren
{0,10:F1} Fliekommazahlen 10 Stellen, 1 NK $acl = Get-Acl $File
Format-Codes: {Index:Code[Genauigkeit]} $zugriff = "bibtest\sorglos","FullControl","Allow"
Codes: N (Zahl) C (Whrung), D (Dezimal), P (Prozent), X (Hex.) Accounts ermitteln mit: Get-WmiObject Win32_Account
Oder: $a = 47.111; $[Link](0000.00) $regel = New-Object [Link] $zugriff
Beispiel: $[Link]($accessRule)
"{0} {1}" -f "Anton", 23 $acl | Set-Acl $Datei
$x = "{0,8:N2} GB von {1,8:N2} GB sind frei" -f 345.34, 876.3325
write-host -f "green" $x
Netzwerk
Strings IP anzeigen/setzen
Get-NetIPInterface -AddressFamily IPv4
String-Operatoren:
Remove-NetIPAddress -InterfaceAlias "Ethernet0" -AddressFamily "IPv4" `
Hans + Wurst Strings zusammenfgen
-Confirm:$false
Hans* 50 Zeichenkette wiederholen
Remove-NetRoute -InterfaceAlias "Ethernet0" -Confirm:$false
Member-Functions: (text | gm)
New-NetIPAddress -InterfaceAlias "Ethernet0" -AddressFamily "IPv4" `
go east replace east,west Ersetzung
-IPAddress [Link] -PrefixLength 8 -DefaultGateway [Link]
$a,$b,$c = "Hans,Berta,Claus" -split ","
Set-DnsClientServerAddress -InterfaceAlias "Ethernet0" -ServerAddr [Link]
$a,$b,$c = "Hans,Berta,Claus".split(",") String splitten+zuweisen
"Stefan","Menne" -join "." Strings verbinden Zugriff auf Fremdrechner
"[Link]".TrimStart("Hans") Anfang entfernen Remoting ermglichen:
"Ein Text".ToUpper() Groschrift Winrm quickconfig; Enable-PSRemoting Force
"Ein Text".ToLower() Kleinschrift Set-Item WSMan:\localhost\client\TrustedHosts *
"Ein Text".Insert(4, "toller ") Text einfgen Set-Item WSMan:\localhost\client\TrustedHosts [Link]
"Ein Text".compareTo("Ein Test") Vergleich Restart-Service WinRM
"Ein Text".Contains("Ein") Auf Enthalten prfen Zugriffsarten:
"Ein Text".Chars(5) Ein Zeichen herausholen a) per Kommando:
" Ein Text ".Trim() Text trimmen $pw = Get-Credential Administrator
" Ein Text ".Length Lnge ermitteln Invoke-Command -ComputerName [Link] -ScriptBlock { Get-
" Ein Text ".TrimEnd().Length Am Ende trimmen ChildItem C:\ } -credential $pw
"Ein Text".Substring(4) Substring ab Pos. 4 b) Session starten:
"Ein Text".Substring(4,2) Substring mit Lnge 2 Enter-PSSession [Link]
"Ein Text".Remove(2,4) Zeichen lschen
Scripte ActiveDirectory
Script-Einstellung AD-Tools
Get-ExecutionPolicy Aktuelle Einstellung abfragen Active-Directory Module installieren/deinstallieren:
Set-ExecutionPolicy RemoteSigned Scripte erlauben Install-WindowsFeature AD-Domain-Services
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser falls nicht Admin Import-Module ADDSDeployment
Typen: Restricted, RemoteSigned, AllSigned, Unrestricted Import-Module ActiveDirectory Laden des AD-Moduls
Scripte, Programme starten Install-ADDSForest -DomainName "[Link]" SafeModeAdministratorPass $pw
& befehl Befehl in neuer Umgebung starten Install-WindowsFeature RSAT-AD-AdminCenter
. script.ps1 Befehl in aktueller Umgebung starten Uninstall-ADDSDomainController LocalAdministratorPassword $pw `
[Link] -noexit &"c:\machwas.ps1" LastDomainControllerInDomain -RemoveApplicationPartitions
& $string Anweisungen im String ausfhren Active-Directory als Provider (Get-PSProvider):
(oder: Invoke-Expression "dir *.exe") cd ad: Ins Active-Directory wechseln
Debug-Level setzen: ls Aktuelles AD-Verzeichnis auflisten
Set-Psdebug -step Schrittweise Ausfhrung von Scripten cd "DC=bib,DC=de" Ins AD wechseln
Set-PsDebug -trace 1 Debug-Level setzen cd "CN=Users" In den Ordner Users wechseln
Andere Programme starten: cd "AD:\CN=Users,DC=bib,DC=de" Absolute Adressierung
&'C:\Programme\Microsoft Office\Office\[Link]' [Link] get-command *-AD* Alle Kommandos zu AD zeigen
start [Link] .\[Link] Programm starten (Start-Process) Informationen abfragen:
Kommentare Get-ADDomain Anzeige der aktuellen Domain
# Kommentar bis Ende Zeile Get-ADDomainController
<# mehrzeiliger Block-Kommentar Get-ADUser -Filter * Properties * Alle Benutzer + Eigenschaften
Kommentar #> Get-ADUser dozmen Properties * Alle Eigenschaften zum Benutzer holen
Wertebergabe, Variablen Get-ADComputer -Filter * Computer auflisten
User anlegen, lschen:
Interaktive Eingabe:
$erg = Read-Host "Bitte eine Zahl eingeben" New-ADUser -name "Stefan Menne" -samAccountName dozmen `
$passwort = Read-Host "Passwort" -AsSecureString -UserPrincipalName dozmen@[Link] -AccountPassword $pw `
Kommandozeilen-Argumente in C-Stil: -Path "CN=Users,DC=bib,DC=de" -enabled $true
$args[0].. $args[n] Argumente User whlen ber: samAccountName, DistinguishedName oder SID
$^ Kommandozeilen-Programmname Name: DisplayName, GivenName, Surname, OtherName, EmailAddress,
Kommandozeilenparameter in PowerShell-Stil DistinguishedName, SID
param ( [Int] $Alter, [String] $Name = "Menne", [Switch] $Aktiv) Account: UserPrincipalName, AccountPassword, ChangePasswordAtLogon,
Aufrufmglichkeiten: .\script.ps1 40 Meierhofer Enabled, samAccountName
.\script.ps1 -Name Mller -Alter 50 -Aktiv Adresse: City, Country, PostalCode, State, StreetAddress
Parameter erzwingen mit: [parameter(Mandatory = $true)] Pfade: HomeDirectory, HomeDrive, ProfilePath, ScriptPath
Hilfen: get-help about_functions_advanced_parameters Remove-ADUser dozmen -Confirm:$false
Parameter-Typ-Deklaration: User-Daten verndern/ergnzen:
Zahlen: [int], [long], [double], [decimal], [float], [single], [byte] Set-ADUser dozmen -HomeDirectory "\\Win2K12R2B\Home\$logname" `
Zeichen: [string], [char] Datum: [datetime] "11.4.2011" -HomeDrive "H:" -ProfilePath "\\Win2K12R2B\Home\$logname\Profile"
Switch: [Switch] $test Dann: if ($test) . Set-ADAccountPassword dozmen -NewPassword $pw
Weitere Type: [bool], [array], [hashtable], [xml],[ADSI] [ADS], [WMI] Organisationseinheiten:
Gltikeitsbereich-Deklarationen: New-ADOrganizationalUnit -Name "Firma" -Path "DC=bib,DC=de"
$global:a=1 berall gltig $script:a=1 nur im Script gltig Get-ADOrganizationalUnit -Filter *
$local:a=1 ab hier gltig $using:a=1 nur im Start-Job gltig (Remove-ADOrganizationalUnit, Set-ADOrganizationalUnit)
$private:a=1 Variable nur hier gltig Gruppen:
Funktionen Get-ADGroup -Filter *
Variante A: Funktionsparameter Objekte verschieben:
function summe ($a = 3, $b = 7) { return $a + $b } Move-ADObject "CN=Stefan Menne, -TargetPath "DC=bib,DC=de
Aufruf: summe 17 04 Testen auf Existenz:
Variante B: benannte Parameter Get-ChildItem "AD:\CN=Stefan Menne,DC=bib,DC=de" 2>&1 > > $null
function summe { param ($WertA = 5, $WertB = 10) if ( ! $?) { } # User existiert noch nicht
return $WertA + $WertB DHCP
} Tools: DHCP installieren (deinstallieren mit Remove-):
Aufruf: summe -WertA 2 -WertB 3 Install-WindowsFeature DHCP -IncludeManagementTools
summe 4 7 DHCP-Server in ActiveDirectory (DC) registrieren:
summe -WertB 4 Add-DhcpServerInDC -DnsName "[Link]"
Schleifen Add Scopes:
Zhlschleife: Add-DhcpServerv4Scope -StartRange [Link] EndRange`
for ($i = 0; $i le 20; $i++) {Write-Host $i} [Link] -SubnetMask [Link] `
foreach ($i in 0..20) {$i} -Name IP-Test-Bereich -Description "Test" Verbose
0..20 dasselbe in kurz Alle DHCP-Scopes aktivieren:
Durcharbeiten von Arrays/CmdLets: Get-DhcpServerv4Scope | Set-DhcpServerv4Scope -State Active
foreach ($i in $Array) { echo $i } DHCP-Optionen setzen:
foreach ($file in Get-ChildItem) { Write-Host $file } Set-DhcpServerv4OptionValue -DnsDomain [Link] `
ps | foreach Begin { $i=0} ` -Router [Link] -DnsServer [Link] Force
Processs {$i++} ` Einzelnen Bereich lschen:
End {"# Prozesse: " + $i} Remove-DhcpServerv4Scope -ScopeId [Link]
kurz: ps | foreach {$i=0} {$i++} {$i} DHCP-Server an Netzwerkinterface binden:
Weitere Strukturen: Set-DhcpServerv4Binding -BindingState $true -InterfaceAlias Ethernet
if (<Test1>) {<Anweisungsliste 1>} Get-DhcpServerv4Scope
[elseif (<Test2>) {<Anweisungsliste 2>}] DNS
[else {<Anweisungsliste 3>}] DNS installieren:
switch ( Montag ) { Install-WindowsFeature -Name 'DNS' IncludeManagementTools
"Montag" { echo Mon ; break } DNS-Zonen erstellen:
default { echo Was anderes } Add-DnsServerPrimaryZone -Name "[Link]" -ReplicationScope Forest
} Add-DnsServerPrimaryZone -Name "[Link]" `
do {<Anweisungsliste>} while (<Bedingung>) -DynamicUpdate Secure -ReplicationScope Forest
while (<Bedingung>) do {<Anweisungsliste>} DNS-Eintrge erstellen:
try { kommando > $NULL} catch{}; if ( ! $?) { } Add-DnsServerResourceRecordA -ZoneName "[Link]" `
Passwrter -Name "anton" -IPv4Address [Link]
$pw=ConvertTo-SecureString -AsPlainText -Force -String "EinTest.11" Add-DnsServerResourceRecordPtr -ZoneName "[Link]"`
Dekodieren: -Name 1 -PtrDomainName '[Link]'
$pw = Read-Host "Passwort eingeben " AsSecureString DNS-Zonen abfragen:
[[Link]]::PtrToStringAuto( Get-DnsServerZone
[[Link]]::SecureStringToBSTR($pw)) Get-DnsServerResourceRecord [Link]
Get-DnsServerRootHint
Dialog-Verarbeitung
Formulare
[void][[Link]]::LoadWithPartialName("[Link]")
$Form=New-Object "[Link]"
$[Link] = $true
$[Link]="Dies ist ein leeres Formular!"
# Textinhalt erzeugen:
$label=New-Object "[Link]"
$[Link]='Hallo Welt'; $[Link]=10
# Button erstellen:
$button = New-Object "[Link]"
$[Link] = "OK"; $[Link]=200
$button.Add_Click({$[Link]()}) # Aktion nach dem Klicken!
Weitere Mglichkeiten
Get-Module -list -All
import-Module PowerShellGet
Install-Module *get-eventlog*
Get-NetFirewallRule
Get-Command *fire*