Magic Quadrant™ für Privileged Access Management 2025: Netwrix zum vierten Jahr in Folge anerkannt. Laden Sie den Bericht herunter.

Plattform
Ressourcen­zentrumBlog
Beherrschung von PowerShell Sleep für das Skriptmanagement

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
      
Image

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."
      
Image

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:

Image

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:

Image

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 mehr

Anhalten, 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..."
      
Image

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

}
      
Image

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:

Image

Die Ausführung des Skripts über die Kommandozeile führt zu Folgendem:

Image

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:

Image

Und hier ist ein Screenshot, der die Ausführung von der Kommandozeile zeigt:

Image

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

Asset Not Found

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.