Magic Quadrant™ per la gestione degli accessi privilegiati 2025: Netwrix riconosciuta per il quarto anno consecutivo. Scarica il report.

Piattaforma
Centro risorseBlog
Padroneggiare PowerShell Sleep per la gestione degli script

Padroneggiare PowerShell Sleep per la gestione degli script

Feb 14, 2025

PowerShell’s Start-Sleep cmdlet pauses script execution for a defined time, helping manage timing, synchronization, and throttling. It supports seconds, milliseconds, or time spans (-Duration) and is often used in loops, scheduling, or waiting for resources. Alternatives like Read-Host enable interactive pauses. Best practices include breaking long sleeps into smaller intervals, avoiding Start-Sleep for condition checks, and preventing infinite loops or timeouts.

Perché potresti aver bisogno di mettere in pausa o ritardare gli script di PowerShell

Il cmdlet Start-Sleep in PowerShell interrompe l'esecuzione di uno script e attende per un tempo specificato. Utilizzare strategicamente le pause può aiutare a garantire un funzionamento fluido e prevenire errori, specialmente negli script che dipendono da sistemi esterni o eventi.

Ecco tre dei principali motivi per cui potresti aver bisogno di utilizzare un comando di pausa di PowerShell:

  • Attendere le risorse — Molti script interagiscono con risorse esterne come file, condivisioni di rete, database e API. Queste risorse potrebbero non essere immediatamente disponibili quando lo script inizia l'esecuzione, o potrebbero richiedere del tempo per rispondere. Ad esempio, se lo script attiva un lavoro in background, potrebbe essere necessario mettere in pausa l'esecuzione dello script per dare tempo al lavoro di completarsi prima di permettere la continuazione dell'esecuzione dello script.
  • Per limitare l'operazione dello script — Gli script PowerShell che chiamano API, effettuano richieste di rete o eseguono comandi su server remoti possono sovraccaricare i sistemi coinvolti, portando a connessioni interrotte e altri errori. Inserire pause adeguate nel tuo script ti aiuterà ad evitare questi problemi. Limitare l'esecuzione dello script è particolarmente importante quando si lavora con grandi set di dati o si eseguono operazioni di massa.
  • Per sincronizzare i processi — In molti scenari di automazione, il successo di un processo può dipendere dal completamento di un altro. Ad esempio, il tuo script potrebbe dover attendere per accedere ai dati fino a che un altro processo non abbia terminato il suo lavoro su quei dati, oppure potrebbe dover ritardare ulteriori operazioni per dare ad un altro servizio la possibilità di avviarsi completamente.

Sintassi del Cmdlet PowerShell Start-Sleep Cmdlet

Parametri principali

La sintassi del comando di attesa PowerShell Start-Sleep dipende dal modo in cui si desidera specificare la durata della pausa dell'esecuzione dello script PowerShell. Ecco le due opzioni di base:

  • -Seconds — Utilizza questo parametro per causare una pausa in PowerShell di alcuni secondi. Il valore può essere un numero intero, oppure puoi usare un numero con la virgola se desideri una pausa come 2,5 secondi. Ecco la sintassi:
      Start-Sleep -Seconds <number>
      
  • Millisecondi — Se vuoi specificare il ritardo di PowerShell in uno script in millisecondi, usa la sintassi qui sotto. In questo caso, il valore deve essere un intero.
      Start-Sleep -Milliseconds <integer>
      

Alias per l'uso abbreviato

Il comando sleep di Windows PowerShell supporta alias abbreviati per ciascuno di questi parametri, che possono essere utilizzati al posto dei nomi completi dei parametri:

  • -s for the -Seconds parameter
  • -ms for the -Milliseconds parameter

Ad esempio, ecco come eseguire un comando “PowerShell wait 5 seconds”:

      Start-Sleep -s 5
      

Ecco come mettere in pausa per 500 millisecondi:

      Start-Sleep -ms 500
      

-Durata Parametro (PowerShell 7.3 e successivi)

Come alternativa all'indicazione di un numero di secondi o millisecondi, è possibile utilizzare il parametro -Duration per specificare un intervallo di tempo. Ecco la sintassi di base:

      Start-Sleep -Duration <TimeSpan>
      

È possibile creare un intervallo di tempo in due modi principali:

  • Utilizzando un formato di stringa (hh:mm:ss, dd.hh:mm:ss, ecc.)
  • Utilizzando il cmdlet New-TimeSpan cmdlet

Ad esempio, supponiamo che tu voglia impostare un timer di sospensione PowerShell per 1 minuto e 30 secondi. Un'opzione è utilizzare il formato hh:mm:ss come questo:

      Start-Sleep -Duration '00:01:30'
      

Un'altra opzione è utilizzare il cmdlet New-TimeSpan nel seguente modo:

      $duration = New-TimeSpan -Minutes 1 -Seconds 30

Start-Sleep -Duration $duration
      

Esempi del cmdlet Start-Sleep in PowerShell

Gli esempi seguenti illustrano come mettere in pausa uno script PowerShell utilizzando ciascun parametro.

Utilizzando i secondi

Questo script ottiene la data e l'ora, si mette in pausa per 5 secondi e poi ottiene la nuova data e l'ora:

      Get-Date; Start-Sleep -Seconds 5; Get-Date
      

Utilizzando i secondi frazionari

Il seguente comando mette in pausa l'esecuzione dello script per 1,5 secondi:

      Start-Sleep -S 1.5
      
Image

Utilizzando i millisecondi

Il seguente comando mette in pausa l'esecuzione dello script per 500 millisecondi:

      Start-Sleep -Milliseconds 500
      

Utilizzando un intervallo di tempo

Lo script di pausa PowerShell seguente utilizza il parametro -Duration per mettere in pausa uno script per 2 minuti:

      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

Casi d'uso avanzati per Start-Sleep

Pausa tra le iterazioni di un ciclo

È possibile mettere in pausa tra le iterazioni di un ciclo utilizzando Start-Sleep all'interno del ciclo. Questo è particolarmente utile quando è necessario attendere risorse esterne, simulare comportamenti come richieste API o moderare l'esecuzione dello script.

Ad esempio, lo script sottostante eseguirà il ciclo while cinque volte, mettendosi in pausa per 10 secondi dopo ogni iterazione:

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

Per offrire una migliore visibilità nell'esecuzione dello script, lo abbiamo eseguito nel PowerShell ISE:

Image

Dormire fino a un orario specifico

A volte è necessario che i compiti vengano eseguiti in un momento specifico della giornata. In tal caso, puoi utilizzare i cmdlet Start-Sleep e Get-Date insieme.

Ad esempio, lo script seguente verrà eseguito immediatamente se sono passate le 18:00; altrimenti, aspetterà fino alle 18:00 per essere eseguito:

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

L'output sottostante è stato generato eseguendo questo script alle 4:22 AM:

Image

Tecniche di pausa interattiva (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.

Padroneggia le basi dello scripting PowerShell

Scarica l'eBook per iniziare con lo scripting di PowerShell

Scopri di più

In pausa fino a quando non viene premuto un tasto

Ecco come utilizzare Read-Host per mettere in pausa uno script fino a quando non viene premuto il tasto Invio:

      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

Richiesta di input dell'utente

È comune richiedere conferma all'utente prima di procedere con azioni potenzialmente distruttive o irreversibili, come l'eliminazione di file o l'esecuzione di modifiche al sistema.

Lo script seguente invita l'utente a rispondere o No e si mette in pausa fino a quando non viene inserita una risposta:

      # 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

Visualizzazione di barre di progresso e timer di conto alla rovescia con Start-Sleep

Può essere utile fornire agli utenti un feedback visivo sull'esecuzione di uno script PowerShell, specialmente per operazioni di lunga durata e cicli. Due opzioni sono le barre di avanzamento e i timer di conto alla rovescia.

Barre di progresso

Per mostrare una barra di avanzamento mentre il tuo script esegue un'operazione che richiede tempo, usa il cmdlet Write-Progress con Start-Sleep. Di seguito è riportato uno script che illustra come visualizzare una barra di avanzamento durante un ritardo di 20 secondi in PowerShell:

      # 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!"
      

Se eseguiamo lo script nell'ISE di PowerShell, appare così:

Image

Eseguendo lo script dalla riga di comando si ottiene quanto segue:

Image

Timer di conto alla rovescia

Un timer di conto alla rovescia mostra quanto tempo manca prima del completamento dello script. Lo script sottostante dimostra come creare un timer di conto alla rovescia insieme a una barra di avanzamento:

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

Ecco cosa vediamo se eseguiamo lo script nell'ISE di PowerShell:

Image

E qui c'è uno screenshot che mostra l'esecuzione dalla riga di comando:

Image

Migliori pratiche per l'uso di Start-Sleep nei script di PowerShell

Le seguenti best practice possono aiutarti ad utilizzare il comando di ritardo PowerShell Start-Sleep nel modo più efficace:

  • Utilizzare Start-Sleep solo quando necessario. Esempi comuni includono l'attesa per un servizio o una risorsa. Inoltre, le pause possono aiutare a evitare limiti di frequenza o sovraccarico del server con chiamate API.
  • Interrompere i lunghi periodi di sonno. Suddividere le lunghe pause di PowerShell in intervalli più brevi e utilizzare Write-Progress per tenere informato l'utente.
  • Non usare Start-Sleep come sostituto per un controllo di condizione. Ad esempio, non c'è bisogno di mettere in pausa lo script per verificare se un file esiste o un processo è stato completato.

Errori comuni e insidie nell'uso di Start-Sleep

Di seguito sono elencati alcuni dei problemi comuni da monitorare quando si utilizza Start-Sleep:

  • Interruzioni delle pause — Interrompere una pausa Start-Sleep con Ctrl + C può lasciare le risorse in uno stato inconsistente. Per gestire tali interruzioni ed eseguire le necessarie operazioni di pulizia, utilizzare la gestione degli errori come i blocchi try-catch o $ErrorActionPreference.
  • Imprecisione della durata della pausa — Il tempismo relativo a Start-Sleep può variare a causa del sovraccarico del sistema e risultare in leggeri ritardi. Evita di fare affidamento su questo cmdlet per azioni critiche legate al tempo o considera l'uso di intervalli più brevi con controlli ripetuti.
  • Cicli infiniti — Avere comandi Start-Sleep all'interno di un ciclo infinito può causare l'esaurimento delle risorse. Per prevenire un uso eccessivo della CPU e della memoria, definire condizioni di uscita chiare per i cicli, utilizzare intervalli di attesa appropriati e aggiungere timeout.

Conclusione

Aggiungere strategicamente pause ai tuoi script PowerShell è un modo efficace per controllare i tempi, prevenire il sovraccarico delle risorse e gestire le dipendenze tra le attività. Il cmdlet Start-Sleep può aiutarti a evitare problemi come il throttling delle risorse, eccessive richieste API o errori di script non necessari. Se hai bisogno di mettere in pausa uno script fino a quando l'utente preme un tasto particolare o fornisce un certo input, utilizza il cmdlet Read-Host.

Assicurati di sperimentare questi cmdlet insieme a tecniche come l'elaborazione parallela, la scrittura di script asincrona e l'automazione basata sugli eventi per trovare il miglior approccio per compiti specifici.

Garantire una visibilità completa dell'attività di PowerShell

Rileva attività sospette e assicura la conformità in PowerShell con Netwrix Auditor

FAQ

Come faccio a mettere in pausa uno script PowerShell per 10 secondi?

Puoi utilizzare il cmdlet PowerShell Start-Sleep per mettere in pausa uno script per un numero specificato di secondi o millisecondi. Ad esempio, questo comando metterà in pausa l'esecuzione dello script per 10 secondi:

      Start-Sleep -Seconds 10
      

Come posso attendere l'input dell'utente prima di riprendere uno script PowerShell?

Puoi utilizzare il cmdlet Write-Host per richiedere l'input all'utente e il cmdlet Read-Host per mettere in pausa l'esecuzione dello script fino a quando non viene fornita una risposta. Questa strategia è spesso utilizzata per raccogliere la password dell'utente o la loro conferma per procedere con un'operazione.

L'esempio seguente mostra come mettere in pausa lo script fino a quando l'utente preme il tasto Invio:

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

Come imposto i timeout in PowerShell?

Per semplici ritardi, puoi utilizzare il cmdlet di PowerShell Start-Sleep. Ma per una vera gestione dei timeout, specialmente per compiti di lunga durata, lavori in background o comandi remoti, opzioni migliori includono Wait-Job e System.Threading.Timer.

Sperimenta questi metodi per adattarli al tuo caso d'uso specifico!

Condividi su

Scopri di più

Informazioni sull'autore

Asset Not Found

Tyler Reese

Vicepresidente della Gestione Prodotti, CISSP

Con più di due decenni nel settore della sicurezza del software, Tyler Reese conosce intimamente le sfide di identità e sicurezza in rapida evoluzione che le aziende affrontano oggi. Attualmente, ricopre il ruolo di direttore del prodotto per il portfolio di Netwrix Identity and Access Management, dove le sue responsabilità includono la valutazione delle tendenze di mercato, la definizione della direzione per la linea di prodotti IAM e, in ultima analisi, la soddisfazione delle esigenze degli utenti finali. La sua esperienza professionale spazia dalla consulenza IAM per le aziende Fortune 500 al lavoro come architetto aziendale di una grande compagnia diretta al consumatore. Attualmente detiene la certificazione CISSP.