Starten met PowerShell: Handige commando's
In mijn eerste BLOG heb ik uitleg gegeven over hoe je PowerShell bij het starten wat vorm kunt geven met het Profile script. In deze blog wil ik wat basis commando's de revue laten passeren die handig zijn bij het gebruik van PowerShell. Ik loop hiermee het risico dat het voor doorgewinterde gebruikers bijzonder saai wordt, maar ik wil het toch niet overslaan.
Get-Help
In PowerShell worden veel commando’s (cmdlets) gevormd uit een samenvoeging tussen [Actie]-[Van]. Dat is handig, zo heb je al snel door waar het commando voor is. In dit voorbeeld: Het Get-Help commando geeft hulp. As easy as it is.
Get-Help Get-Help
geeft dus informatie over het Get-Help commando. (Tik maar eens in!)
Onderschat en vergeet ‘m niet: Het is een krachtige tool. Bijna een volledige bibliotheek met veel informatie. Niet alleen over commando’s maar ook algemene info. Zoals het antwoord van Get-Help Get-Help al aangeeft: "Get-Help about_*" geeft een uitgebreid overzicht van artikelen over diverse onderwerpen. Bijzonder de moeite waard!
Get-ChildItem
Het Get-ChildItem commando is zo'n beetje als het “dir” commando (of “ls”), maar het kan meer. Het geeft een lijst van de (child)objecten op een locatie. Hierbij denk je vaak aan bestanden, maar Get-ChildItem gaat verder. Je kunt er ook mee door de Registry en Certificate store navigeren.
Met een commando als Get-ChildItem HKCU:// -recurse |Select-String "password" kun je snel in de registry (in dit geval HKCU:// = Hyve Key Current User) scannen naar “password”
Let wel: PowerShell geeft keurig antwoord, maar gebruik dat antwoord niet klakkeloos bij een nieuwe uitvraag, dat snapt ‘ie niet.
Blijf altijd de HKCU:// gebruiken. Dat is als je erover nadenkt ook wel logisch: zonder de HKCU:// voorvoegsel gaat het commando zoeken naar een bestand i.p.v. in de registry. Nu met Get-Item de registry key opvragen:
Get-History
Get-History laat zien wat je allemaal hebt ingetikt in de PowerShell console. Deze geschiedenis beperkt zich tot de huidige PowerShell sessie: Na afsluiten van de shell is alles weg. Het is een handige tool om terug te kijken wat je tijdens deze sessie hebt getypt en eventueel om deze acties weg te schrijven met een Out-File voor logging. bijvoorbeeld met:
Get-History | Out-File ((Get-Date -uformat %Y-%m-%d) + " - powershell acties.log”)
Voor geschiedenis op het systeem buiten de huidige sessie kun je terecht bij de cmdlet Get-PSReadLineOption. Hier staan de globale instellingen, die je eventueel ook kunt aanpassen met Set-PSReadLineOption.
Gemakkelijk na te lezen met:
notepad (Get-PSReadLineOption).HistorySavePath
Voor het vastleggen van alles wat er in een sessie gebeurt kun je gebruik maken van transcript.
Met Start-Transcript start je de vastlegging, met Stop-Transcript stop je de vastlegging.
Het grote verschil tussen Get-History en transcript is dat bij een transcript alles vastgelegd wordt: zowel de ingevoerde commando's als de output van die commando's. Get-History is dus handig als naslagwerk van 'hoe deed ik dat ook alweer', terwijl een transcript voor volledige verslaglegging is.
Get-Member
Superhandige cmdlet om te kijken wat een object allemaal aan eigenschappen heeft (oftewel: wat je er alemaal mee kunt doen). En aangezien bijna alles in PowerShell een object is, levert dat best veel informatie. Als we bijvoorbeeld heel simpel 0 intypen en daar Get-Member van opvragen, zie je dat het een Integer (getal) object is, met enkel Methods.
Voor de liefhebbers: (0).Equals(0)
Write-Host en Write-Output
Get-Host en $Host zijn de actieve PowerShell consoles. Met Write-Host kun je naar het console schrijven.
Niet te verwarren met z’n broertje Write-Output, die het uitspuugt naar de ontvangende kant.
Ter vergelijking:
Write-Host “Hallo Wereld” | Out-File “ookhallo.txt”
levert een tekst op de console en een leeg bestand:
Write-Output “Hallo Wereld” | Out-File “ookhallo.txt”
levert een leeg console en tekst in het bestand:
En hiermee alweer Out-File langs zien komen (net ook al): De cmdlet waarmee je de output van een commando naar een bestand kunt overzetten.
Meer info over verdere Write varianten is uiteraard te vinden onder Get-Help Write-Output.
Get-Command
Een handige cmdlet, waarmee je een overzicht krijgt van op dit moment beschikbare commando’s. Welke commando’s je ter beschikking hebt is ook afhankelijk van de modules die geladen zijn.
Welke modules actief zijn kun je zien met Get-Modules. Nieuwe modules kun je installeren met Install-Module (als Administrator) en inladen in de PowerShell sessie met Import-Module.
Wees altijd alert bij het installeren en gebruiken van externe modules. Verzeker je ervan dat je de bron kunt vertrouwen.
Tot slot
Nog een klein voorbeeld dat gebruik maakt met veel van de bovenstaande informatie (en anders pak je Get-Help erbij)
# --- mini check of $PATH allemaal (nog) bestaan
foreach ($path in (Get-Item env:path).Value.Split(";")) {
if ($path.length -gt 0) {
if (Test-Path $path) {
Write-Host -ForegroundColor green $path "ok"
} else {
Write-Host -ForegroundColor red $path "missing!"
}
}
}
Wat het doet: Het haalt met Get-Item de omgevingsvariabele $PATH (env:path) op en splitst die lijst op de ";". Vervolgens loopt het de lijst door en geeft een melding op missende directories. Het resultaat ziet er dan ongeveer zo uit:
Leuk toch, voor zo’n kort stukje code?
Harm ter Veer