Starten met PowerShell: Profiles

Aangepast:

Wij hebben het idee opgevat om periodiek iets te schrijven voor onze achterban, of voor een ieder die het leuk vindt. Gewoon wat dingen die wij interessant vinden en jou kunnen helpen met waar je mee bezig bent. Ik houd, in elk geval in Windows, van PowerShell. De komende tijd ga ik je alle ins en outs uitleggen, beginnende met deze ‘PowerShell: Profiles’.

PowerShell is een krachtige shell (duh), een tekst console waar je commando’s kunt uitvoeren. PowerShell zit standaard in alle nieuwe Windows versies, waardoor je het eigenlijk altijd bij de hand hebt. Het is zelfs beschikbaar voor MacOS en Linux, maar waarom je het daar zou gebruiken is mij vooralsnog onduidelijk. MacOS en Linux hebben namelijk al eigen snelle(re) shells aan boord.
Meer basis informatie over PowerShell is hier te vinden.

Profile.ps1, standaard of customised 

Standaard ziet Powershell er bij het opstarten zo uit:

Dat vind ik dan weer minder mooi, ik begin graag met een mooi schoon venster. In elk geval zonder “Try this” reclame. Bovendien heb ik graag een aantal dingen vooringesteld, zoals het pad naar mijn PowerShell scripts. Dit kan allemaal door gebruik te maken van een standaard script, dat door PowerShell uitgevoerd wordt bij het starten. En de keuze is reuze, dat maakt het ook gelijk een beetje tricky:

  1. Je kunt persoonlijke en system-wide profile scripts hebben

  2. Je kunt een profile script hebben voor dit systeem specifiek, of voor alle systemen

Om het nog mooier te maken: De naamgeving is ook nog eens veranderd vanaf versie 7.


In PowerShell Versie 5:

  • WindowsPowerShell\Microsoft.PowerShell_profile.ps1

In PowerShell Versie 7:

  • PowerShell\Microsoft.PowerShell_profile.ps1

Voor een volledig overzicht zie: about_profiles.

Ik heb een standaard Windows 10 omgeving met PowerShell versie 5.1:

En mijn “My Documents” map is “C:\Users\Harm\Documents”, dus mijn nieuw te gebruiken profile.ps1 wordt: C:\Users\Harm\Documents\WindowsPowerShell\ Microsoft.PowerShell_profile.ps1

Met de mooie inhoud:

Dut nait! Goed en slecht nieuws

Ok, nou heb ik dus die  “Microsoft.PowerShell_profile.ps1” gemaakt en krijg ik dit bij het starten van PowerShell:

Het goede nieuws is: hij ziet mijn profile script. Het slechte nieuws is: hij doet het niet. PowerShell weigert ‘m uit te voeren. Dit heeft te maken met execution policies, een (overigens doorgaans prima te omzeilen) mechanisme om ongewenst misbruikt van PowerShell scripts te voorkomen.


Eerst eens kijken hoe het erbij staat:

Blijkbaar zijn er op mijn machine geen execution policies gedefinieerd en valt PowerShell daarom terug naar Restricted (default voor Windows werkstations).
Ik mag dus geen scripts uitvoeren.

Aangezien profile.ps1 een script is wordt deze dus geweigerd. Een shell zonder scripts is niet echt optimaal, dus het instellen van een execution policy is wenselijk.

Niet echt spannend die execution policies, of toch wel?

Het configureren van een execution policy is niet echt spannend, maar blijf je altijd bewust van de impact! Meer informatie over execution policies is hier te vinden.
Gelukkig weigert PowerShell mijn verzoek om even alles open te zetten op mijn computer:

 
Dit was dan uiteraard ook geen logische actie om te doen. 
Beperk jezelf bij het instellen van de execution policy altijd tot de kleinst mogelijke scope
Voor mijn computer is dat op dit moment, denk ik, mijn Account + RemoteSigned. Misschien kan ik naar AllSigned, maar dan moet ik al mijn locale scripts signeren. Dat is misschien een leuk onderwerp voor een andere keer.

Kijken wat ‘ie doet…

Tadaa!!

Maar wacht, er is meer!

Nu ik een Profile script heb, kan ik die mooi vullen met standaard dingen die ik handig vind om te hebben. Zoals:

  • Instellen console buffer en grootte
  • Instellen zoekpad
  • Tonen van wat basis informatie.

Het commando Get-Host geeft informatie over PowerShell, misschien wel meer dan je denkt als je gaat kijken. Door de UI eigenschap op de vragen kun je dit duidelijk zien:

Het leuke is: Met Set-Host kun je dingen weer terugzetten. In mijn script ziet dat er zo uit:

Instellen van het zoekpad kan simpel, door deze aan de globale $env:path toe te voegen. $env:path bestaat uit een lijst met paden, gescheiden door een “;”. Om te voorkomen dat ik het toe te voegen pad aan het laatste pad in de rij plak, voeg ik het toe met een “;” ervoor. Dit levert weer het risico op dat er “;;” in de lijst staat (wat overigens geen kwaad kan), dit los ik nog even op door eventuele “;;” te vervangen door “;”. Samen met wat basis informatie ziet er dan zo uit:

En dat is het! 

Tot slot

Het profile.ps1 script is niet alleen handig, er zijn een tweetal punten van aandacht:

Voor beheerders

Het profile.ps1 script wordt uitgevoerd elke keer dat PowerShell gestart wordt, behalve als het de parameter “-noprofile” in de commandline wordt meegegeven. Denk hieraan bij het maken van login- en logout scripts. Een creatieve scripter, ik dus, kan hier goed gebruik van maken. Dit geldt vooral voor Citrix en Terminal Server! 

Voor gebruikers 

Mocht je in een omgeving zitten waar je geen, of een alternatieve profile.ps1 wilt gebruiken, dan kun je dat gemakkelijk doen met een Dos batch bestand:
@echo off
Powershell -noprofile -ExecutionPolicy unrestricted -NoExit -File .\stick-profile.ps1

Bijvoorbeeld handig op een USB stickje met eigen coole tools.
 

Harm ter Veer - mei 2022