Skip to content

Instantly share code, notes, and snippets.

@enimiste
Last active August 4, 2026 16:19
Show Gist options
  • Select an option

  • Save enimiste/39eedfda6e6593f7be8bb02ffafd5cd5 to your computer and use it in GitHub Desktop.

Select an option

Save enimiste/39eedfda6e6593f7be8bb02ffafd5cd5 to your computer and use it in GitHub Desktop.
caffeinate.ps1 - empêcher Windows de se mettre en veille (équivalent macOS caffeinate)

caffeinate.ps1 — l'équivalent de caffeinate (macOS) pour Windows

Petit script PowerShell qui empêche Windows de se mettre en veille, tant qu'il tourne. Aucune installation, aucune dépendance : il appelle directement l'API Win32 SetThreadExecutionState, c'est-à-dire exactement le même mécanisme que celui utilisé par caffeinate sur macOS.

Le verrou est libéré automatiquement quand le script s'arrête (Ctrl+C, fin du délai, ou fermeture de la fenêtre).


Prérequis

  • Windows 10 ou 11
  • Windows PowerShell 5.1 (inclus d'origine) ou PowerShell 7+
  • Aucun droit administrateur nécessaire

Installation

1. Créer le dossier de scripts et le fichier

$dir = "$HOME\.local\bin"
New-Item -ItemType Directory -Force -Path $dir | Out-Null
notepad "$dir\caffeinate.ps1"

Colle le contenu de caffeinate.ps1 (voir en bas de ce gist), puis enregistre et ferme.

2. Autoriser l'exécution des scripts locaux (une seule fois par machine)

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

Si tu as téléchargé le fichier plutôt que de le taper, débloque-le : Unblock-File "$HOME\.local\bin\caffeinate.ps1"

3. Créer la commande caffeinate (recommandé)

Ajoute une fonction dans ton profil PowerShell pour pouvoir taper simplement caffeinate :

if (-not (Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force | Out-Null }
Add-Content $PROFILE "`nfunction caffeinate { & `"`$HOME\.local\bin\caffeinate.ps1`" @args }"

Redémarre PowerShell. Vérifie que ça répond :

caffeinate -Minutes 1

Utilisation

Commande Effet
caffeinate Machine éveillée indéfiniment, l'écran peut s'éteindre (défaut)
caffeinate -Display Machine et écran maintenus allumés
caffeinate -Minutes 90 Veille bloquée 90 minutes puis libération automatique
caffeinate -Minutes 45 -Display 45 minutes, écran allumé aussi

Pour arrêter avant la fin : Ctrl+C, ou ferme simplement la fenêtre.

Exemples concrets

Laisser tourner un build long sans que le poste s'endorme :

caffeinate            # dans une fenêtre à part, puis lance ton build ailleurs

Rester « disponible » sur Teams/Slack pendant une réunion, écran allumé :

caffeinate -Display -Minutes 60

Bloquer la veille le temps d'une commande précise, puis libérer :

Start-Process powershell -ArgumentList '-NoProfile','-File',"$HOME\.local\bin\caffeinate.ps1",'-Minutes','30'
# ... ta tâche ...

Vérifier que le verrou est actif

Dans une autre fenêtre PowerShell :

powercfg /requests

Tu dois voir powershell.exe (ou pwsh.exe) listé sous SYSTEM, et sous DISPLAY si tu as utilisé -Display.


Options

Paramètre Type Défaut Description
-Minutes int 0 Durée en minutes. 0 = indéfini.
-Display switch absent Maintient aussi l'écran allumé (ES_DISPLAY_REQUIRED).

Le script

caffeinate.ps1 :

param([int]$Minutes = 0, [switch]$Display)

$sig = @'
[DllImport("kernel32.dll")]
public static extern uint SetThreadExecutionState(uint esFlags);
'@
$p = Add-Type -MemberDefinition $sig -Name Power -Namespace Win32 -PassThru

# Le suffixe L évite l'interprétation en Int32 signé
$ES_CONTINUOUS       = [uint32]0x80000000L
$ES_SYSTEM_REQUIRED  = [uint32]0x00000001L
$ES_DISPLAY_REQUIRED = [uint32]0x00000002L

$flags = $ES_CONTINUOUS -bor $ES_SYSTEM_REQUIRED
if ($Display) { $flags = $flags -bor $ES_DISPLAY_REQUIRED }
$flags = [uint32]$flags   # -bor peut repasser en Int64

try {
    if ($p::SetThreadExecutionState($flags) -eq 0) {
        Write-Warning "L'appel a échoué."
        return
    }
    $mode = if ($Display) { "système + écran" } else { "système seul (écran libre)" }
    if ($Minutes -gt 0) {
        Write-Host "Veille bloquée ($mode) pendant $Minutes min. Ctrl+C pour arrêter."
        Start-Sleep -Seconds ($Minutes * 60)
    } else {
        Write-Host "Veille bloquée ($mode) indéfiniment. Ctrl+C pour arrêter."
        while ($true) { Start-Sleep 60 }
    }
}
finally {
    $p::SetThreadExecutionState($ES_CONTINUOUS) | Out-Null
    Write-Host "Verrou libéré."
}

Dépannage

... ne peut pas être chargé car l'exécution de scripts est désactivée sur ce système → Lance Set-ExecutionPolicy -Scope CurrentUser RemoteSigned (voir étape 2).

Impossible de convertir la valeur «-2147483645» en type «System.UInt32» → Tu utilises une version du script sans le suffixe L. PowerShell interprète un littéral hexadécimal de 8 chiffres comme un Int32 signé, ce qui rend 0x80000003 négatif. Le script ci-dessus corrige le problème avec [uint32]0x80000000L et un recast de $flags après le -bor.

Le poste s'endort quand même → Une stratégie de groupe d'entreprise ou un délai de veille imposé par l'administrateur peut ignorer les demandes applicatives. Vérifie avec powercfg /requests que la demande est bien enregistrée, puis regarde powercfg /a et les réglages Alimentation.

caffeinate n'est pas reconnu après l'étape 3 → Redémarre la fenêtre PowerShell. Si le problème persiste, vérifie le contenu de ton profil : Get-Content $PROFILE.

L'écran s'éteint alors que je veux le garder allumé → C'est le comportement par défaut. Ajoute -Display.


Désinstallation

Remove-Item "$HOME\.local\bin\caffeinate.ps1"
notepad $PROFILE   # puis supprime la ligne "function caffeinate { ... }"

Alternatives sans script

  • PowerToys Awake — inclus dans Microsoft PowerToys, interface graphique + CLI, gère aussi le suivi d'un PID.
  • Caffeine (Zhorn Software) — exécutable portable qui simule une frappe clavier périodique.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment