Er zijn veel redenen om de uitvoering van een script te pauzeren. Misschien moet een script wachten op gebruikersinvoer, de uitvoeringssnelheid vertragen of wachten tot een ander proces is afgerond voordat het verder gaat. Zoals bij de meeste taken in PowerShell, is er meer dan één manier om een script te pauzeren. Afhankelijk van wat je probeert te bereiken, zal de methode van pauzeren die je kiest, zijn sterke en zwakke punten hebben. Een extra complicatie voor de beschikbare opties is de nieuwe cross-platform mogelijkheid van PowerShell. Aangezien PowerShell vaak wordt gebruikt als een manier om verschillende technologieën aan elkaar te “lijmen”, heeft de Linux-commandoregel, net als in Windows, opties voor het pauzeren van de uitvoering die ook in PowerShell kunnen worden opgenomen.
Methoden voor het pauzeren van PowerShell
Wat zijn de verschillende manieren om de uitvoering van een script te pauzeren? In dit artikel gaan we de mogelijkheid om te pauzeren opsplitsen in native en niet-native commando’s. Met native verwijzen we naar die commando’s die PowerShell- of .NET-ingebouwde functies of methoden zijn. Niet-natieve methoden worden gedefinieerd als programma’s die specifiek zijn voor Windows en Linux en die in combinatie met PowerShell kunnen worden gebruikt.
Native Methoden
Start-Sleep
[System.Threading.Thread]::Sleep()
Read-Host
[Console]::ReadKey()
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Niet-natieve methoden
Windows
pause
timeout
Linux
sleep
read -p
Zoals je kunt zien, zijn er verschillende opties, elk met hun voor- en nadelen. Welke je gebruikt, zal van invloed zijn op hoe de uitvoering wordt onderbroken en welke andere effecten die onderbreking met zich mee kan brengen.
Native Methoden
Om te beginnen zullen we de native methoden uiteenzetten, omdat deze het meest worden gebruikt in scripts.
Start-Sleep
De meest gebruikte opdracht voor onderbreken is verreweg Start-Sleep
. Deze opdracht heeft twee eenvoudige invoeren, namelijk -Seconds
en -Milliseconds
. Seconden kunnen een waarde zijn van System.Double
, terwijl milliseconden alleen System.Int32
waarden accepteert. Door de twee te combineren, kan precieze controle over de duur van de onderbreking worden bereikt. Start-Sleep
heeft ook een alias van sleep
.
Vóór PowerShell 6.2.0 kon je geen waarde voor fractionele seconden schrijven, zoals 2.3
, wat dezelfde lengte van tijd is als waarvoor we pauzeren in de bovenstaande code. Met 6.2.0 worden fractionele waarden nu ondersteund, dus in plaats van de seconden en milliseconden onafhankelijk te schrijven, kun je nu aangeven: -Seconds 2.3
.
Het is belangrijk op te merken dat je uit een
Start-Sleep
-functie kunt breken doorCtrl-C
te gebruiken. Dit geldt niet voor alle methoden!
Draad Slaap
A less commonly used method of pausing execution is the [System.Threading.Thread]::Sleep()
.NET method. By passing in a System.Int32
or a TimeSpan
value, this allows pausing of the current thread for a set amount of time. For example, to pause by that same amount of time, 2.3
seconds, as in our Start-Sleep
example, we can write:
Om een tijdsduur constructie te gebruiken met de Thread Sleep methode, kun je het volgende doen:
Om een draad onbepaald te pauzeren, kun je de [System.Threading.Timeout]::InfiniteTimeSpan
gebruiken, maar houd er rekening mee dat dit je proces kan blokkeren.
In tegenstelling tot
Start-Sleep
, staat de Thread Sleep methode niet toe dat je uit de slaaproutine breekt metCtrl-C
. Afhankelijk van je toepassing kan dit wenselijk zijn.
Ook belangrijk om te weten over thread sleep is dat het geen exacte tijds garantie biedt. Alle thread sleep heeft de garantie dat het ten minste zoveel seconden zal wachten. Aangezien thread sleep telt samenvallen met klok tikken, kunnen andere programma’s deze pauzefunctie onderbreken en de wachttijd langer maken.
Hoewel thread sleep zijn toepassingen heeft, is het beter om een van de andere ingebouwde methoden te gebruiken vanwege deze problemen.
Read-Host
De bovenstaande methoden beschrijven manieren om de uitvoering te pauzeren, maar alleen voor een bepaalde tijd. De andere manier om de uitvoering te pauzeren is door te vragen om gebruikersinvoer. Met deze methode moet een handmatige handeling worden verricht, maar het kan zeer nuttig zijn om een bevestiging te vereisen om door te gaan en eventueel extra invoer op te nemen.
Read-Host
is een van de meest voorkomende manieren om gebruikersinvoer op te vragen. Door om gebruikersinvoer te vragen, kan de resulterende invoer worden opgeslagen voor verder gebruik in de code, of om de uitvoering indien nodig te onderbreken.
Zodra tekst is ingevoerd, is het noodzakelijk om op de enter- of return-toets te drukken om de uitvoering voort te zetten. Door dit te doen, en zonder de invoer op te slaan in een variabele, wordt dezelfde tekst die is ingevoerd naar de console uitvoergegeven.

Als u de resulterende ingevoerde tekst wilt opslaan in een variabele voor later gebruik, wijs dan eenvoudig de invoer van Read-Host
toe aan een variabele.
Soms wilt u de ingevoerde tekst lezen als een beveiligde tekenreeks. Gelukkig maakt Read-Host
dat buitengewoon eenvoudig.
Ctrl-C
stelt u in staat om uit deRead-Host
prompt te breken.
Console ReadKey Methode
Met behulp van de methode [Console]::ReadKey()
kunt u eenvoudig toetsopdrachten lezen, samen met modificatoren, terwijl het programma wordt gepauzeerd. Standaard worden de verzonden toetsopdrachten teruggegeven aan het scherm als een System.ConsoleKeyInfo
-object. Dit omvat de Key
, KeyChar
en de Modifiers
-waarden, die erg handig kunnen zijn bij het controleren op bepaalde toetscombinaties.

Vaak wilt u controleren op een bepaalde toetsinvoer voordat u continu doorgaat. Dit kan eenvoudig worden gedaan met behulp van een Do-While
-lus zoals hieronder.

Houd er rekening mee dat aangezien we op zoek zijn naar een specifieke toetscombinatie,
Ctrl-C
ons hier niet uit de invoer zal halen.
Host RawUI ReadKey Methode
Uiteindelijk hebben we de $host.UI.RawUI.ReadKey()
methode. Dit lijkt op de Console ReadKey methode, maar deze methode staat het toe om extra opties in de ReadKey methode te passeren om gedrag en uitvoer verder te controleren.

Er zijn een aantal ReadKeyOptions
die doorgegeven kunnen worden die de RawUI ReadKey methode nuttiger kunnen maken.
AllowCtrlC
IncludeKeyDown
IncludeKeyUp
NoEcho
Dit kan op de volgende manier gebruikt worden die key down events zal includeren en de tekst niet zal echoën.
Deze methode zal het gebruik van
Ctrl-C
toestaan om uit het commando te breken, behalve als deAllowCtrlC
optie gebruikt wordt.
Niet-Inheemse Methoden
In deze sectie verkennen we een paar niet-inheemse methoden om scriptuitvoering te pauzeren. Deze methoden zijn bedoeld voor het gebruik van niet-PowerShell console-specifieke hulpmiddelen die geïntegreerd kunnen worden in PowerShell scripts afhankelijk van je behoeften.
Windows
Het pauzecommando is erg eenvoudig en zal Druk op een willekeurige toets om door te gaan...
weergeven en op die manier blijven staan totdat er op een toets wordt gedrukt om de uitvoering te hervatten.

Je kunt je afvragen hoe je dit in een script moet gebruiken, maar net als bij elk ander commando, voeg je het cmd /c 'pause'
-commando toe in je script om de native functionaliteit te gebruiken.

Meestal gebruikt in Windows batchbestanden, maakt het timeout-commando het mogelijk om een bepaald aantal seconden te pauzeren en eventueel alle toetsopdrachten te negeren. Een gebruikersaanslag zal meestal de uitvoering hervatten, zelfs als de time-outperiode nog niet is verstreken. Het wordt heel eenvoudig gebruikt door het aantal seconden door te geven.

Net zoals bij het pauze
-commando, voeg je het timeout
-commando toe in het script en in het onderstaande voorbeeld drukken we op de enter-toets om door te gaan.

Linux
Net als het pauze
-commando in Windows, maakt het slapen
-commando in Linux het mogelijk om een willekeurige waarde in te stellen voor de slaapstand. In tegenstelling tot het pauzecommando heeft het slapen
-commando een paar meer opties die flexibiliteit bieden in de slaaptijd.

De sleep
-opdracht heeft ook optionele achtervoegsels waarmee langere tijdsperioden kunnen worden gedefinieerd. Voorbeelden:
sleep 1m
– Slapen gedurende één minuutsleep 2h
– Slapen gedurende twee uursleep 1d
– Slapen gedurende één dag
Tenslotte kan Linux ook pauzeren door de read
-toepassing te gebruiken om te wachten tot op de Enter-toets wordt gedrukt om de uitvoering voort te zetten. Er is een optionele time-outparameter die de uitvoering voortzet als de Enter-toets niet binnen de opgegeven tijd wordt ingedrukt.

Conclusie
Zoals je kunt zien, zijn er veel manieren om de uitvoering binnen een script of op de opdrachtregel te onderbreken. Afhankelijk van je behoeften kan het zo eenvoudig zijn als een Start-Sleep
-opdracht of een meer complex proces dat wordt aangestuurd door invoer. In combinatie met native opdrachten biedt de PowerShell-pauze flexibiliteit in bijna elke omgeving en maximale scriptfunctionaliteit.