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).
- Windows 10 ou 11
- Windows PowerShell 5.1 (inclus d'origine) ou PowerShell 7+
- Aucun droit administrateur nécessaire
$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.
Set-ExecutionPolicy -Scope CurrentUser RemoteSignedSi tu as téléchargé le fichier plutôt que de le taper, débloque-le :
Unblock-File "$HOME\.local\bin\caffeinate.ps1"
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| 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.
Laisser tourner un build long sans que le poste s'endorme :
caffeinate # dans une fenêtre à part, puis lance ton build ailleursRester « disponible » sur Teams/Slack pendant une réunion, écran allumé :
caffeinate -Display -Minutes 60Bloquer 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 ...Dans une autre fenêtre PowerShell :
powercfg /requestsTu dois voir powershell.exe (ou pwsh.exe) listé sous SYSTEM, et sous DISPLAY
si tu as utilisé -Display.
| 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). |
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é."
}... 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.
Remove-Item "$HOME\.local\bin\caffeinate.ps1"
notepad $PROFILE # puis supprime la ligne "function caffeinate { ... }"- 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.