Meester PowerShell Pauze: Commandoregel & Scripting Technieken

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.

Start-Sleep -Seconds 2 -Milliseconds 300

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 door Ctrl-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:

[System.Threading.Thread]::Sleep(2300)

Om een tijdsduur constructie te gebruiken met de Thread Sleep methode, kun je het volgende doen:

[System.Threading.Thread]::Sleep([TimeSpan]::New(0, 0, 0, 2, 300))

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 met Ctrl-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.

Read-Host -Prompt "Press any key to continue"

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.

Press Enter to Move Execution Along

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.

$Input = Read-Host -Prompt "Press any key to continue"

Soms wilt u de ingevoerde tekst lezen als een beveiligde tekenreeks. Gelukkig maakt Read-Host dat buitengewoon eenvoudig.

$SecureInput = Read-Host -Prompt "Enter your password" -AsSecureString

Ctrl-C stelt u in staat om uit de Read-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.

[Console]::ReadKey()
Console ReadKey Command

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.

Do {
	$Key = [Console]::ReadKey($True)
	Write-Host $Key.Key
} While ( $Key.Key -NE [ConsoleKey]::Escape )
Do-While Loop Key

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.

$host.UI.RawUI.ReadKey()
RawUI.ReadKey

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.

$host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')

Deze methode zal het gebruik van Ctrl-C toestaan om uit het commando te breken, behalve als de AllowCtrlC 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

Pauze

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.

cmd /c 'pause'
Pause Command

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.

Cmd/C Pause Command

Timeout

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.

# Pauzeer voor 2 seconden
timeout /t 2

# Pauzeer voor 5 seconden maar sta geen toetsenbordaanslagen toe
timeout /t 5 /nobreak

# Pauzeer onbepaald totdat er een toets wordt ingedrukt
timeout /t -1
Timeout Command

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.

Timeout Command Execution

Linux

Slapen

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.

sleep 2.3s
Sleep Command

De sleep-opdracht heeft ook optionele achtervoegsels waarmee langere tijdsperioden kunnen worden gedefinieerd. Voorbeelden:

  • sleep 1m – Slapen gedurende één minuut
  • sleep 2h – Slapen gedurende twee uur
  • sleep 1d – Slapen gedurende één dag

Lees -P

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.

read -p 'Press enter to continue' -t 5
Read Application to Pause

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.

Source:
https://adamtheautomator.com/powershell-pause/