Beherrschung von PowerShell Sleep für das Skriptmanagement
Feb 14, 2025
PowerShell’s Start-Sleep cmdlet setzt die Skriptausführung für eine definierte Zeit aus, um Timing, Synchronisation und Drosselung zu verwalten. Es unterstützt Sekunden, Millisekunden oder Zeitspannen (-Duration) und wird oft in Schleifen, Planungen oder beim Warten auf Ressourcen verwendet. Alternativen wie Read-Host ermöglichen interaktive Pausen. Zu den Best Practices gehören das Aufteilen langer Wartezeiten in kleinere Intervalle, das Vermeiden von Start-Sleep für Zustandsprüfungen und das Verhindern von Endlosschleifen oder Timeouts.
Warum Sie möglicherweise ein Pause oder eine Verzögerung in PowerShell-Skripten benötigen könnten
Das Cmdlet Start-Sleep in PowerShell pausiert die Ausführung eines Skripts und wartet eine angegebene Zeit. Strategisch eingesetzte Pausen können eine reibungslose Funktionalität gewährleisten und Fehler vermeiden, besonders in Skripten, die von externen Systemen oder Ereignissen abhängig sind.
Hier sind drei der wichtigsten Gründe, warum Sie einen PowerShell-Pause-Befehl verwenden müssen:
- To wait for resources — Many scripts interact with external resources like files, network shares, databases and APIs. These resources might not be immediately available when your script starts running, or they might require some time to respond. For example, if your script triggers a background job, you might need to pause script execution to give that job time to complete before allowing script execution to continue.
- Um die Ausführung von Skripten zu drosseln — PowerShell-Skripte, die APIs aufrufen, Netzwerkanfragen stellen oder Befehle auf entfernten Servern ausführen, können die beteiligten Systeme überlasten, was zu unterbrochenen Verbindungen und anderen Fehlern führen kann. Angemessene Pausen in Ihrem Skript helfen Ihnen, diese Probleme zu vermeiden. Die Drosselung der Skriptausführung ist besonders wichtig, wenn Sie mit großen Datensätzen arbeiten oder Massenoperationen durchführen.
- Um Prozesse zu synchronisieren — In vielen Automatisierungsszenarien kann der Erfolg eines Prozesses von der Fertigstellung eines anderen abhängen. Zum Beispiel könnte Ihr Skript warten müssen, um auf Daten zuzugreifen, bis ein anderer Prozess seine Arbeit an diesen Daten abgeschlossen hat, oder es könnte notwendig sein, weitere Operationen zu verzögern, um einem anderen Dienst die Chance zu geben, vollständig zu starten.
Syntax des PowerShell Start-Sleep Cmdlets
Kernparameter
Die Syntax des PowerShell-Wartebefehls Start-Sleep hängt davon ab, wie Sie die Dauer der Pause der PowerShell-Skriptausführung angeben möchten. Hier sind die zwei grundlegenden Optionen:
- -Sekunden — Verwenden Sie diesen Parameter, um eine PowerShell-Pause in Sekunden zu bewirken. Der Wert kann eine ganze Zahl sein, oder Sie können eine Fließkommazahl verwenden, wenn Sie eine Pause wie 2,5 Sekunden wünschen. Hier ist die Syntax:
Start-Sleep -Seconds <number>
- Millisekunden — Wenn Sie die Verzögerung in einem PowerShell-Skript in Millisekunden angeben möchten, verwenden Sie die untenstehende Syntax. In diesem Fall muss der Wert eine ganze Zahl sein.
Start-Sleep -Milliseconds <integer>
Aliase für die Kurzform-Nutzung
Der Windows PowerShell Sleep-Befehl unterstützt Kurzform-Aliase für jeden dieser Parameter, die anstelle der vollständigen Parameternamen verwendet werden können:
- -s für den -Seconds-Parameter
- -ms für den -Milliseconds-Parameter
Zum Beispiel, hier ist, wie man einen „PowerShell wait 5 seconds“ Befehl ausführt:
Start-Sleep -s 5
Und so pausieren Sie für 500 Millisekunden:
Start-Sleep -ms 500
-Dauer Parameter (PowerShell 7.3 und später)
Als Alternative zur Angabe einer Anzahl von Sekunden oder Millisekunden können Sie den Parameter -Duration verwenden, um eine Zeitspanne festzulegen. Hier ist die grundlegende Syntax:
Start-Sleep -Duration <TimeSpan>
Sie können eine Zeitspanne auf zwei Hauptwegen erstellen:
- Verwendung eines Zeichenkettenformats (hh:mm:ss, dd.hh:mm:ss, usw.)
- Mit dem New-TimeSpan-Cmdlet
Nehmen wir zum Beispiel an, Sie möchten einen PowerShell-Schlaf-Timer für 1 Minute und 30 Sekunden einstellen. Eine Möglichkeit ist die Verwendung des Formats hh:mm:ss wie folgt:
Start-Sleep -Duration '00:01:30'
Eine weitere Option ist die Verwendung des New-TimeSpan-Cmdlets wie folgt:
$duration = New-TimeSpan -Minutes 1 -Seconds 30
Start-Sleep -Duration $duration
Beispiele für das Start-Sleep Cmdlet in PowerShell
Die folgenden Beispiele veranschaulichen, wie man ein PowerShell-Skript mit jedem Parameter anhält.
Sekunden verwenden
Dieses Skript ruft das Datum und die Uhrzeit ab, pausiert für 5 Sekunden und ermittelt dann das neue Datum und die Uhrzeit:
Get-Date; Start-Sleep -Seconds 5; Get-Date
Verwendung von Bruchsekunden
Der folgende Befehl pausiert die Skriptausführung für 1,5 Sekunden:
Start-Sleep -S 1.5
Verwendung von Millisekunden
Der folgende Befehl pausiert die Skriptausführung für 500 Millisekunden:
Start-Sleep -Milliseconds 500
Zeitdauer verwenden
Das folgende PowerShell-Pausenskript verwendet den Parameter -Duration um ein Skript für 2 Minuten anzuhalten:
Write-Host "The script will pause for 2 minutes..."
Start-Sleep -Duration (New-TimeSpan -Minutes 2)
Write-Host "The pause is over, and the script continues."
Erweiterte Anwendungsfälle für Start-Sleep
Pausieren zwischen den Iterationen einer Schleife
Sie können zwischen den Iterationen einer Schleife pausieren, indem Sie Start-Sleep innerhalb der Schleife verwenden. Das ist besonders nützlich, wenn Sie auf externe Ressourcen warten müssen, Verhalten wie API-Anfragen simulieren oder die Ausführung des Skripts drosseln möchten.
Zum Beispiel wird das folgende Skript die while-Schleife fünfmal ausführen und nach jeder Iteration 10 Sekunden pausieren:
$counter = 1 # Initialize a counter
$maxIterations = 5 # Define the maximum number of iterations
while ($counter -le $maxIterations) {
Write-Host "Iteration $counter: Working on the task..."
# Add a 10-second pause between iterations
Start-Sleep -Seconds 10
$counter++ # Increment the counter
}
Write-Host "All iterations are complete."
Um eine bessere Sichtbarkeit der Skriptausführung zu gewährleisten, haben wir es in der PowerShell ISE ausgeführt:
Schlafen bis zu einem bestimmten Zeitpunkt
Manchmal müssen Aufgaben zu einer bestimmten Tageszeit ausgeführt werden. In diesem Fall können Sie die Start-Sleep- und Get-Date-Cmdlets gemeinsam verwenden.
Zum Beispiel wird das folgende Skript sofort ausgeführt, wenn es bereits nach 18 Uhr ist; andernfalls wird es warten, bis es 18 Uhr ist, um zu laufen:
# Get the current date and time
$currentTime = Get-Date
# Define the target time for 6 PM
$targetTime = Get-Date -Hour 18 -Minute 0 -Second 0
# Check if the current time is already past 6 PM
if ($currentTime -ge $targetTime) {
Write-Host "It's already past 6 PM. No need to pause."
} else {
# Calculate the time difference until 6 PM
$timeToSleep = $targetTime - $currentTime
# Convert the time difference to total seconds
$secondsToSleep = [math]::Ceiling($timeToSleep.TotalSeconds)
Write-Host "The script will pause for $secondsToSleep seconds until 6 PM."
# Sleep until 6 PM
Start-Sleep -Seconds $secondsToSleep
}
Write-Host "It's now 6 PM or later. Continuing execution."
Die folgende Ausgabe wurde durch das Ausführen dieses Skripts um 4:22 Uhr morgens generiert:
Interaktive Pausierungstechniken (Read-Host)
Sometimes you need to pause a script until the user presses a particular key or provides certain input, such as their password or the answer to a question. In those situations, use the Read-Host cmdlet rather than Start-Sleep.
Beherrschen Sie die Grundlagen des PowerShell-Scriptings
Laden Sie das eBook herunter, um mit dem PowerShell-Scripting zu beginnen
Erfahren Sie mehrAnhalten, bis eine Taste gedrückt wird
So verwenden Sie Read-Host, um ein Skript anzuhalten, bis die Eingabetaste gedrückt wird:
Write-Host "The script is running. Press Enter to continue..."
Read-Host # Waits for the user to press Enter
Write-Host "You pressed Enter. Continuing the script..."
Aufforderung zur Benutzereingabe
Es ist üblich, den Benutzer um Bestätigung zu bitten, bevor man mit potenziell destruktiven oder irreversiblen Aktionen fortfährt, wie dem Löschen von Dateien oder der Durchführung von Systemänderungen.
Das folgende Skript fordert den Benutzer auf, mit Ja oder Nein zu antworten und wartet, bis eine Antwort eingegeben wird:
# Prompt user for confirmation
$userInput = Read-Host "Do you want to continue? (Yes/No)"
# Check the user's response
if ($userInput -eq "Yes" -or $userInput -eq "Y") {
Write-Host "You chose to continue. Proceeding with the script..."
# Insert the next steps of your script here
} elseif ($userInput -eq "No" -or $userInput -eq "N") {
Write-Host "You chose not to continue. Exiting the script."
# Optionally, you can exit the script or perform other actions
exit
} else {
Write-Host "Invalid input. Please enter 'Yes' or 'No'."
# You can loop back and ask again or exit
}
Fortschrittsbalken und Countdown-Timer anzeigen mit Start-Sleep
Es kann hilfreich sein, Benutzern visuelles Feedback über die Ausführung eines PowerShell-Skripts zu geben, insbesondere bei lang andauernden Operationen und Schleifen. Zwei Optionen sind Fortschrittsbalken und Countdown-Timer.
Fortschrittsbalken
Um eine Fortschrittsanzeige anzuzeigen, während Ihr Skript eine zeitaufwändige Operation ausführt, verwenden Sie das Cmdlet Write-Progress zusammen mit Start-Sleep. Unten ist ein Skript dargestellt, das zeigt, wie man eine Fortschrittsanzeige während einer 20-sekündigen PowerShell-Verzögerung anzeigt:
# Total duration for the operation in seconds
$totalDuration = 20
# Loop to simulate a long-running process
for ($i = 1; $i -le $totalDuration; $i++) {
# Calculate the percent complete
$percentComplete = ($i / $totalDuration) * 100
# Display the progress bar
Write-Progress -Activity "Processing..." -Status "Please wait..." -PercentComplete $percentComplete
# Simulate work being done with Start-Sleep
Start-Sleep -Seconds 1 # Sleep for 1 second
}
# Final message after the loop
Write-Host "Process complete!"
Wenn wir das Skript in der PowerShell ISE ausführen, sieht es so aus:
Die Ausführung des Skripts über die Kommandozeile führt zu Folgendem:
Countdown-Timer
Ein Countdown-Timer zeigt an, wie viel Zeit bis zum Abschluss des Skripts verbleibt. Das folgende Skript demonstriert, wie man einen Countdown-Timer zusammen mit einer Fortschrittsanzeige erstellt:
# Total duration for the countdown in seconds
$totalDuration = 20
# Loop to simulate countdown with progress feedback
for ($i = $totalDuration; $i -ge 1; $i--) {
# Calculate the percent complete
$percentComplete = (($totalDuration - $i) / $totalDuration) * 100
# Display the progress bar and countdown
Write-Progress -Activity "Countdown Timer" -Status "Time remaining: $i second(s)" -PercentComplete $percentComplete
# Simulate a 1 second delay
Start-Sleep -Seconds 1
}
# Final message after the countdown
Write-Host "Countdown complete! Time's up."
Hier ist, was wir sehen, wenn wir das Skript in der PowerShell ISE ausführen:
Und hier ist ein Screenshot, der die Ausführung von der Kommandozeile zeigt:
Best Practices für die Verwendung von Start-Sleep in PowerShell-Skripten
Die folgenden bewährten Methoden können Ihnen helfen, das PowerShell-Verzögerungsbefehl Start-Sleep am effektivsten zu nutzen:
- Verwenden Sie Start-Sleep nur wenn notwendig. Häufige Beispiele sind das Warten auf einen Dienst oder eine Ressource. Zusätzlich können Pausen dabei helfen, Ratenbeschränkungen oder Serverüberlastungen bei API-Aufrufen zu vermeiden.
- Unterbrechen Sie lange Schlafphasen. Teilen Sie lange PowerShell-Pausen in kürzere Intervalle und verwenden Sie Write-Progress, um den Benutzer auf dem Laufenden zu halten.
- Verwenden Sie Start-Sleep nicht als Ersatz für eine Bedingungsprüfung. Zum Beispiel ist es nicht notwendig, Ihr Skript anzuhalten, um zu überprüfen, ob eine Datei existiert oder ein Prozess abgeschlossen wurde.
Häufige Fallstricke und Stolperfallen bei der Verwendung von Start-Sleep
Im Folgenden finden Sie einige der häufigen Probleme, auf die Sie achten sollten, wenn Sie Start-Sleep verwenden:
- Unterbrechende Pausen — Das Unterbrechen einer Start-Sleep-Pause mit Strg + C kann Ressourcen in einem inkonsistenten Zustand hinterlassen. Um solche Unterbrechungen zu verwalten und notwendige Aufräumarbeiten durchzuführen, verwenden Sie Fehlerbehandlungen wie try-catch-Blöcke oder $ErrorActionPreference.
- Ungenauigkeit der Pausendauer — Die Zeitmessung im Zusammenhang mit Start-Sleep kann aufgrund von Systemüberlastungen variieren und zu leichten Verzögerungen führen. Verlassen Sie sich nicht auf dieses Cmdlet für zeitkritische Aktionen oder erwägen Sie die Verwendung kürzerer Intervalle mit wiederholten Überprüfungen.
- Unendliche Schleifen — Das Vorhandensein von Start-Sleep Befehlen in einer unendlichen Schleife kann zu Ressourcenüberlastung führen. Um übermäßigen CPU- und Speicherverbrauch zu verhindern, definieren Sie klare Ausstiegsbedingungen für Schleifen, verwenden Sie angemessene Schlafintervalle und fügen Sie Timeouts hinzu.
Fazit
Das strategische Hinzufügen von Pausen zu Ihren PowerShell-Skripten ist eine effektive Methode, um das Timing zu steuern, Ressourcenüberlastung zu verhindern und Abhängigkeiten zwischen Aufgaben zu handhaben. Das Start-Sleep-Cmdlet kann Ihnen helfen, Probleme wie Ressourcendrosselung, übermäßige API-Anfragen oder unnötige Skriptfehler zu vermeiden. Wenn Sie ein Skript pausieren müssen, bis der Benutzer eine bestimmte Taste drückt oder eine bestimmte Eingabe macht, verwenden Sie das Read-Host-Cmdlet.
Stellen Sie sicher, dass Sie mit diesen Cmdlets experimentieren und Techniken wie parallele Verarbeitung, asynchrones Scripting und ereignisgesteuerte Automatisierung kombinieren, um den besten Ansatz für spezifische Aufgaben zu finden.
Stellen Sie eine vollständige Sichtbarkeit in PowerShell-Aktivitäten sicher
Erkennen Sie verdächtige Aktivitäten und gewährleisten Sie Compliance in PowerShell mit Netwrix Auditor
FAQ
Wie pausiere ich ein PowerShell-Skript für 10 Sekunden?
Sie können das PowerShell-Cmdlet Start-Sleep verwenden, um ein Skript für eine bestimmte Anzahl von Sekunden oder Millisekunden anzuhalten. Zum Beispiel wird dieser Befehl die Ausführung des Skripts für 10 Sekunden pausieren:
Start-Sleep -Seconds 10
Wie kann ich in einem PowerShell-Skript auf Benutzereingaben warten, bevor es fortgesetzt wird?
Sie können das Cmdlet Write-Host verwenden, um den Benutzer zur Eingabe aufzufordern und das Cmdlet Read-Host um die Skriptausführung zu pausieren, bis eine Antwort gegeben wird. Diese Strategie wird oft verwendet, um das Passwort des Benutzers oder deren Bestätigung für die Fortsetzung einer Operation zu sammeln.
Das folgende Beispiel zeigt, wie Sie Ihr Skript anhalten, bis der Benutzer die Eingabetaste drückt:
Write-Host "The script is running. Press Enter to continue..."
Read-Host # Waits for the user to press Enter
Write-Host "You pressed Enter. Continuing the script..."
Wie setze ich Timeouts in PowerShell?
Für einfache Verzögerungen können Sie das PowerShell-Cmdlet Start-Sleep verwenden. Aber für echtes Timeout-Handling, besonders bei langlaufenden Aufgaben, Hintergrundjobs oder Remote-Befehlen, sind bessere Optionen Wait-Job und System.Threading.Timer.
Experimentieren Sie mit diesen Methoden, um sie an Ihren spezifischen Anwendungsfall anzupassen!
Teilen auf
Erfahren Sie mehr
Über den Autor
Tyler Reese
VP of Product Management, CISSP
Mit mehr als zwei Jahrzehnten in der Software-Sicherheitsbranche ist Tyler Reese bestens vertraut mit den sich schnell entwickelnden Identitäts- und Sicherheitsherausforderungen, denen Unternehmen heute gegenüberstehen. Derzeit ist er als Produktleiter für das Netwrix Identity and Access Management Portfolio tätig, wo seine Aufgaben die Bewertung von Markttrends, die Festlegung der Richtung für die IAM-Produktlinie und letztendlich die Erfüllung der Bedürfnisse der Endanwender umfassen. Seine berufliche Erfahrung reicht von IAM-Beratung für Fortune-500-Unternehmen bis hin zur Arbeit als Unternehmensarchitekt eines großen Direkt-an-Verbraucher-Unternehmens. Derzeit hält er die CISSP-Zertifizierung.
Erfahren Sie mehr zu diesem Thema
Powershell Delete File If Exists
PowerShell Write to File: "Out-File" und Dateiausgabetechniken
So erstellen Sie neue Active Directory-Benutzer mit PowerShell
So führen Sie ein PowerShell-Skript aus
Was ist PowerShell? Ein kompletter Leitfaden zu seinen Funktionen & Anwendungen