Windows Powershell – The Basics 3
We zijn aangekomen bij de 3e Windows Powershell post en nu gaan we echt werken met Powershell commando’s. In deze post gaan we aan de slag met navigeren, directories en bestanden.
Het eerste waar we naar gaan kijken is het navigeren in Powershell. Het is noodzakelijk om naar verschillende directories te kunnen navigeren binnen de (Windows) directorystructuur.
Laten we eens kijken waar we ons bevinden. Uiteraard kunnen we dit zien aan het pad achter het PS commando. Deze ziet er dan als volgt uit:
PS C:\Users\Jarno> |
Onze huidige directory is dus “C:\Users\Jarno”. Dit kunnen we verifieren met het Get-Location commando.
PS C:\Users\Jarno> Get-Location Path ---- C:\Users\Jarno |
Om naar een andere locatie te gaan kunnen we het “Set-Location” commando gebruiken. Als we naar C:\Windows willen typen we:
Set-Location C:\Windows |
Om te zien welke bestanden en mappen de huidige directory bevat gebruiken we:
<strong>Get-ChildItem</strong> |
Om een directory omlaag te navigeren gebruik je het “sl” commando. In de commando-prompt gebruikte we hiervoor het CD commando (welke overigens ook werkt). Om een directory omlaag te navigeren gebruik je “sl ..“. Let goed op de spatie tussen sl en de 2 punten:
sl .. |
Om 2 directories omlaag te navigeren herhalen we het commando incl. een slash. Dus:
sl ..\.. |
Nu we naar een andere directory genavigeerd zijn kunnen we gemakkelijk terug navigeren middels het “Set-Location” commando. Dit betekend wel dat we exact moeten weten hoe de mappen heten waar we naartoe navigeren. Een andere optie om te navigeren is niet met “Set-Location” maar met “Push-Location“. Met het “Push-Location” commando plaatsen we de huidige locatie in een variabele welke we later kunnen gebruiken om terug te navigeren. Om “C:\Windows” in de locatie variabele op te slaan gebruik je:
Push-Location c:\Windows |
Navigeer naar een willekeurige folder en gebruik onderstaande commando om terug te navigeren naar de locatie variabele (C:\Windows).:
Pop-Location |
Met “Pop-Location” wordt je terug genavigeerd naar de locatie in de “Current Location” variabele, ofwel de laatst opgeslagen variabele met “Push-Location”. In plaats van “Push-Location” kun je het command “pushd” gebruiken en i.p.v. “Pop-Location” kun je het commando “popd” gebruiken. Maar er is meer! Je kunt namelijk niet alleen de Current Location variabele beschrijven je kunt ook zelf location variabelen definiëren. Bijvoorbeeld:
pushd "C:\Program Files\Adobe" -StackName AdobeProgFiles |
Bovenstaande commando slaat het pad “C:\Program Files\Adobe” op in de “AdobeProgFiles” locatie variabele. Middels onderstaande variabele navigeer je gemakkelijk en altijd terug naar de Adobe folder:
popd -StackName AdobeProgFiles |
Een stack variabele kan meerdere paden bevatten. Om alle paden in de default current location stack te zien gebruik je:
Get-Location -stack |
Om alle paden in de AdobeProgFiles stack te zien gebruik je:
Get-Location -StackName AdobeProgFiles |
Wist je dat je via Powershell ook binnen het Windows register kunt navigeren. Nee? Dat doe je dus door de hive te definiëren. “hklm:” is dus: HKEY_LOCAL_MACHINE. Standaard worden er 2 register drives herkend, namelijk:
hkcu: = HKEY_CURRENT_USER
hklm: = HKEY_LOCAL_MACHNE
Alle drives kun je vinden via:
<strong>Get-PSDrive</strong> |
Alleen register drives kun je vinden door de provider te definiëren:
Get-PSDrive -PSProvider registry |
Mocht je een nieuwe register drive willen maken dan gebruik je het “New-PSDrive” commando:
New-PSDrive -PSProvider registry -Root HKEY_CLASSES_ROOT -Name HKCR |
Een register drive verwijder je met “Remove-ItemProperty“:
Remove-PSDrive -Name HKCR |
Het openen van een register hive werkt als volgt:
Bijvoorbeeld:
PS C:\> sl hklm: PS HKCU:\> ls ---------------------- DRIVERS HARDWARE SAM SOFTWARE SYSTEM |
Verdere registerbewerkingen komen we in een later hoofdstuk op terug.
Nu we aardig kunnen navigeren is het leuk om een aantal Windows variabelen te leren waarmee je snel door de Windows folderstructuur kunt navigeren. Deze variabelen zijn binnen heel Windows te gebruiken en beperken zich niet tot alleen Powershell. Jaja… zo leerde nog eens wa….
%HOMEDRIVE% & %SYSTEMDRIVE%
C:
%SYSTEMROOT% & %WINDIR%
C:\Windows
%HOMEPATH% & %USERPROFILE%
C:\Users\{username}
%PROGRAMFILES%
C:\Program Files
%ProgramFiles(x86)%
Locatie van 32 bits programma’s bij een 64 bit systeem C:\Program Files (x86)
%ProgramData% & %ALLUSERSPROFILE%
C:\ProgramData
%TEMP% & %TMP%
C:\Users\{Username}\AppData\Local\Temp
%USERNAME%
Toont huidige {username}
%COMPUTERNAME%
Toont huidige {computername}
%PATH%
Toont PATH waardes zoals: C:\Windows\System32\;C:\Windows\;C:\Windows\System32\Wbem
%COMSPEC%
Pad naar ” cmd.exe”, zoals: C:\Windows\System32\cmd.exe
Bovenstaande variabelen zijn te gebruiken in Windows Explorer, de command-line en vele andere toepassingen binnen Windows. Zo ook in Powershell… maar dan met een twist. In Powershell werken de procent tekens niet omdat deze ergens anders voor bedoeld zijn. In plaats daarvan gebruiken we de Windows variabelen zonder het procentteken maar met de toevoeging “$env:” om aan te geven dat het om een Windows variabele gaat. %TMP% wordt dus: “$env:TMP”.
Navigeren naar “C:\Program Files” kan dus als volgt:
sl $env:ProgramFiles |
Zoals we al geleerd hebben kun je met “Get-ChildItem” alle bestanden en mappen bekijken in een folder. Door het toevoegen van de “-Force” optie voegen we in dit overzicht ook alle verborgen items en systeembestanden toe.
Get-ChildItem -Force |
Je kunt zelfs vanuit folder A de inhoud van folder B bekijken door simpelweg de doelfolder toe te voegen:
Get-ChildItem -Force "C:\Program Files" |
Met het “Get-ChildItem” commando krijg je net zoals met het “DIR” CMD commando alle bestanden en folders te zien in de huidige (of opgegeven) folder. Om alle onderliggende mappen en bestanden te zien (dus de complete onderliggende inhoud van alle folders en subfolders) gebruik je de “-Recurse” switch:
Get-ChildItem -Force "C:\Program Files\Adobe" -Recurse |
Powershell biedt de gebruiker vele krachtige commando’s om te filteren. Een voorbeeld is met de “-Include” switch. Zo kunnen we met deze switch ervoor zorgen dat alleen *.txt bestanden worden weergegeven in de Adobe Photoshop folder:
Get-ChildItem -Force "C:\Program Files\Adobe\Adobe Photoshop CS5 (64 Bit)" -Include *.txt |
Je kunt echter nog veel krachtiger filteren met de “Where-Object” cmdlet. In de volgende Powershell post zullen we hier wat dieper op ingaan. Voor nu alleen een voorbeeld om de weergave te filteren op alle *.dll bestanden die staan op de C: schijf welke bewerkt zijn na 31 oktober 2016:
Get-ChildItem -Force "C:\" -Recurse -Include *.dll | Where-Object -FilterScript {($_.LastWriteTime -gt "2016-10-31") |
We kunnen nog meer leuke trucjes met het “Get-ChildItem” commando. Zo kunnen we het commando gebruiken om alle items in een folder te tellen:
(Get-ChildItem "C:\Program Files\Adobe\Adobe Photoshop CS5 (64 Bit)" -Force).Count |
Wat opvalt aan bovenstaande commando is dat het commando en opgegeven pad tussen haakjes staan en dat het Count commando met een . gekoppeld is. Eigenlijk is het .Count commando hier het hoofdcommando en gebruikt hij de waardes welke aangegeven staan tussen de haakjes. De haakjes zijn als het ware de input voor het commando.
Ook dit commando kunnen we uitbreiden. Laten we alle TXT bestanden in de C:\Windows\Temp folder eens tellen:
Get-ChildItem C:\Windows\Temp -Recurse –Include "*.txt").Count |
Ik denk dat we helemaal klaar zijn voor de volgende stap, het:
Werken met bestanden in Powershell
Creatie is de start van alles en daarom beginnen we hier met het maken van een folder. De meeste nieuwe zaken in Powershell worden gemakt met het “New-Item” commando. Om een map te maken gebruiken we als toevoeging “-ItemType “directory””. Een nieuwe folder aanmaken gaat dus als volgt:
New-Item NieuweFolder -ItemType "directory" |
Om een folder op een andere locatie te maken voeg je het pad naar de locatie toe:
New-Item -Path "c:\NieuweFolder" -ItemType "directory" |
In bovenstaande voorbeeld gebruiken we “-Path” om aan te geven dat het hier om een pad gaat. In dit voorbeeld zouden we deze flag weg kunnen laten en dan zou het commando nog steeds succesvol worden uitgevoegd. Powershell weet vaak hoe een commando geïnterpreteerd moet worden.
Toch is het slim om jezelf aan te leren om de juiste flags te gebruiken. Als dit een gewoonte wordt dan wordt het lezen van Powershell scripts ook veel duidelijker en vergeet je het toevoegen van een flag nooit waar dit wel verplicht of vereist is.
Voor een bestand, bijvoorbeeld een *.txt bestand gebruiken we als ItemType het type “file”:
New-Item bestand.txt -ItemType "file" |
Op dezelfde manier kunnen we ook een Symbolic Link ofwel een SymLink of Snelkoppeling aanmaken. Let op, SymLinks kun je alleen aanmaken als je Powershel uitvoert in “elevated” modus ofwel als “Administrator”.
Onderstaande voorbeeld is een voorbeeld van een snelkoppeling naar een folder, de C:\ root folder. Allereerst specificeer je als ItemType een SymbolicLink, vervolgens de naam en tenslotte het doel van de snelkoppeling.
New-Item -ItemType SymbolicLink -Name C-Snelkoppeling -Target c:\ |
Een Symbolic Link naar een bestand werkt vrijwel hetzelfde. Specificeer de naam van de snelkoppeling en vervolgens het pad naar het bestand.
New-Item -ItemType SymbolicLink -Name Snelkoppeling-naar-log -Target c:\log.txt |
I.p.v. “Target” wordt bij de snelkoppeling naar een bestand vaak “Value” gebruikt:
New-Item -ItemType SymbolicLink -Name Snelkoppeling-naar-log -Value c:\log.txt |
Mocht je de Symbolic Link op willen slaan op een andere locatie dan gebruik je i.p.v. “-Name” welke alleen de naam voor de snelkoppeling specificeert de “-Path” flag om het hele pad (incl. bestandsnaam) te specificeren:
New-Item -ItemType SymbolicLink -Path c:\Snelkoppeling-naar-log -Value c:\log.txt |
For the record… ook deze commando’s werken prima zonder de “-Name” of “-Path” toevoegingen:
New-Item -ItemType SymbolicLink c:\Snelkoppeling-naar-log -Value c:\log.txt |
En in tegenstelling tot het maken van items moeten we soms ook items verwijderen. Verwijderen doen we met (verrassend) het “Remove-Item” commando.
Remove-Item C:\log.txt |
Als je items gaat verwijderen zal Powershell je om een bevestiging vragen alvorens hij het item werkelijk verwijderd (how Windows)… Echter kunnen we deze vraag omzeilen door toevoeging van de Recurse flag. Als volgt dus:
Remove-Item C:\log.txt -Recurse |
Het verplaatsen van bestanden doen we met het “Move-Item” commando en werkt als volgt:
Move-Item C:\log.txt C:\logbestanden |
In bovenstaande voorbeeld verplaatsen we dus het bestand “log.txt” op de C drive naar de folder “C:\logbestanden”.
Om alle bestanden te verplaatsen kun je b.v. ook het sterretje gebruiken om alle bestanden in een directory te verplaatsen:
Move-Item C:\oudelogs\* C:\logbestanden |
Of alleen alle *.txt bestanden:
Move-Item C:\oudelogs\*.txt C:\logbestanden |
Standaard zal het Move-Item commando geen bestanden overschrijven. Dus als een bestand naar een andere directory verplaatst wordt waar al een bestand met dezelfde naam staat dan zal de move actie falen en een fout genereren. Echter door toevoeging van de “-Force” flag kunnen we ervoor zorgen dat bestanden wel overschreven worden:
Move-Item C:\log.txt C:\logbestanden -Force |
Ok, met Move-Item kunnen we bestanden verplaatsen. Maar we kunnen er ook bestanden mee hernoemen. Een bestand hernoemen van “oudenaam.txt” naar “nieuwenaam.txt” werkt dan als volgt:
Move-Item C:\logbestanden\oudenaam.txt C:\logbestanden\nieuwenaam.txt |
Een andere (meer logisch) commando voor het hernoemen van bestanden is het “Rename-Item” commando.
Rename-Item C:\logbestanden\oudenaam.txt nieuwenaam.txt |
Ook kunnen we folders hernoemen:
Rename-Item C:\logbestanden C:\logfiles |
Mocht je willen weten of een specifiek bestand bestaat dan gebruik je het “Test-Path” commando. Als het bestand bestaat dan resulteert het commando in een “True” en zo niet dan resulteert het commando in een “False”.
Test-Path c:\logbestanden\log.txt |
Dit werkt ook voor paden:
Test-Path c:\logbestanden\ |
Tot zover het werken met bestanden en mappen. Deze post vormt de basis voor de volgende Powershell posts. Powershell werkt volgens het principe welke in deze post uitgelegd is. Niet zo moeilijk toch?
In de volgende post kijken we wat dieper in het register en gaan we ook 2 commando’s wat beter bekijken.
Stay tuned…