Accueil Windows Fichier bat : un double-clic ne l’ouvre pas, il l’exécute

Fichier bat : un double-clic ne l’ouvre pas, il l’exécute

Un double-clic n’ouvre pas un fichier bat, il le lance. Sans confirmation, sans aperçu, sans retour en arrière, et avec exactement les droits du compte qui a cliqué. C’est la première chose à savoir sur ce format, et c’est précisément ce que les fiches d’extension oublient de dire. Tout le reste, lire un script reçu puis en écrire un utile, découle de ce seul point.

Pourquoi un double-clic sur un fichier bat ne demande jamais confirmation

Windows associe l’extension .bat à l’interpréteur cmd.exe, et l’action par défaut de cette association n’est pas « afficher », c’est « exécuter ». Le fichier part donc ligne par ligne dès le second clic. Une fenêtre noire apparaît, souvent moins d’une seconde, puis se referme à la dernière commande. L’utilisateur n’a rien vu, et rien ne lui dit ce qui vient de se produire.

Schéma comparant le double-clic, qui exécute le fichier bat, et le clic droit Modifier, qui l'affiche

Un garde-fou existe, mais il est partiel. Un fichier récupéré par un navigateur, une messagerie ou un client de courrier reçoit un marquage invisible, le flux Zone.Identifier, posé par le gestionnaire de pièces jointes de Windows. Au lancement, une boîte « Fichier ouvert : avertissement de sécurité » s’affiche. Ce marquage disparaît dès que le fichier transite par une clé USB formatée en FAT32 ou par certaines extractions d’archive. Autrement dit, le script le plus douteux peut arriver sans le moindre avertissement.

Le double-clic n’élève pas les droits, et beaucoup s’en rassurent à tort. Les droits d’une session standard suffisent déjà à réécrire le contenu du dossier Documents, du Bureau et du dossier OneDrive synchronisé, à modifier les clés de registre de l’utilisateur courant et à lancer un téléchargement. L’élévation en administrateur n’est nécessaire que pour toucher au système lui-même. Pour les fichiers personnels, elle ne sert à rien.

Dernier détail, et il fait des dégâts : Windows masque par défaut l’extension des types connus. Un fichier nommé photo.jpg.bat s’affiche donc photo.jpg. Le seul indice restant est l’icône, une page blanche à engrenages. Activer l’affichage des extensions de noms de fichiers dans l’Explorateur prend dix secondes et supprime toute la classe de pièges reposant sur la double extension. Ce réflexe vaut aussi pour les installeurs MSI, à ceci près qu’un .msi ouvre au moins une fenêtre d’installation avant d’agir.

Ce qu’il y a vraiment dans un fichier bat

Un .bat est un fichier texte, rien de plus. Une commande par ligne, lues dans l’ordre, interprétées par cmd.exe. La plupart des scripts utiles pèsent entre 200 et 2 000 octets, soit une quinzaine de lignes au maximum. Ce format sert à enchaîner ce qu’on refuse de retaper chaque semaine : copier un dossier de travail vers un disque externe, renommer une série de fichiers, connecter un lecteur réseau, lancer trois programmes d’un coup, ou faire le ménage dans les fichiers TMP laissés par des applications mal fermées.

Deux lignes reviennent partout et méritent une traduction. @echo off empêche l’affichage de chaque commande avant son exécution, ce qui rend la fenêtre propre mais aussi beaucoup moins bavarde. pause maintient la fenêtre ouverte jusqu’à une frappe clavier, et c’est la réponse à la question la plus posée sur le sujet : un script qui « se ferme tout de suite » ne plante pas, il a simplement fini.

Reste la question du cousin .cmd. Même interpréteur, même syntaxe, une différence réelle sur un point précis : dans un .bat, les commandes internes comme SET, PATH, ASSOC, PROMPT ou FTYPE ne modifient le code de retour qu’en cas d’erreur, alors qu’un .cmd le remet à zéro après chaque réussite. Conséquence pratique pour tout script qui teste ses erreurs : préférer .cmd. L’extension .bat est un héritage de MS-DOS conservé pour la compatibilité, et elle traîne avec elle quelques comportements de 1981 que personne ne redessinerait aujourd’hui.

Lire un fichier bat reçu sans rien déclencher

Trois gestes affichent le contenu sans l’interpréter. Aucun ne passe par un double-clic.

  1. Clic droit, puis « Modifier ». La méthode canonique, avec une réserve de taille sous Windows 11 : l’entrée ne figure plus dans le menu contextuel compact. Il faut appuyer sur Maj+F10, ou faire Maj + clic droit, ou cliquer sur « Afficher plus d’options » pour retrouver le menu hérité. Beaucoup de lecteurs cherchent « Modifier », ne le trouvent pas, et finissent par double-cliquer par dépit.
  2. Ouvrir le Bloc-notes d’abord, puis y glisser le fichier. Cette méthode fonctionne quelle que soit l’association du système, y compris quand un éditeur tiers l’a détournée. C’est la plus sûre des trois, parce que le programme qui reçoit le fichier est choisi avant, pas déduit de l’extension.
  3. La commande type dans une invite de commandes. Taper type "C:\chemin\du\script.bat" affiche le texte dans la console sans rien exécuter. Pratique sur un poste distant ou quand l’Explorateur n’est pas disponible.

Un mot sur la case « Débloquer », visible en bas de l’onglet Général des propriétés du fichier. Elle sert à retirer le marquage d’origine externe, et il ne faut surtout pas la cocher avant d’avoir lu le script. Sa seule présence est une information utile : elle prouve que le fichier vient de l’extérieur. Le mécanisme est le même que celui qui fait débloquer un fichier JAR téléchargé, à la différence près qu’un JAR bloqué refuse de démarrer, alors qu’un .bat bloqué se contente de poser une question.

Ce qui doit faire refermer le fichier sans le lancer

La lecture ne demande pas de savoir programmer. Elle demande de reconnaître une poignée d’intentions.

Les cinq signaux d'alerte à repérer dans un script bat reçu d'un inconnu
  • Une suppression récursive silencieuse visant un dossier personnel, la racine d’un disque ou un chemin construit à partir d’une variable d’environnement.
  • Un formatage de volume, sous n’importe quelle forme.
  • Un téléchargement suivi de l’exécution immédiate du fichier récupéré. C’est la signature la plus fréquente des scripts de première charge, et elle tient en deux lignes.
  • Une écriture dans les clés de démarrage automatique du registre, qui fait revenir le programme à chaque ouverture de session.
  • Une longue chaîne illisible, encodée puis décodée et passée à un interpréteur. Un script honnête n’a aucune raison de cacher ses commandes.
  • La désactivation d’une protection ou l’ajout d’une exclusion antivirus.

Le critère qui résume tous les autres tient en une phrase : un script utile est court, lisible, et chacune de ses lignes se comprend en la lisant. Trois cents lignes obfusquées envoyées par un inconnu sur un forum ne se corrigent pas, elles se suppriment.

Écrire un fichier bat utile, et le tester sans rien casser

Voici une sauvegarde incrémentale d’un dossier de travail vers un disque externe. Sept lignes, aucune commande destructrice, et un journal.

@echo off
chcp 65001 >nul
set "SOURCE=%USERPROFILE%\Documents\Projets"
set "CIBLE=D:\Sauvegardes\Projets"
robocopy "%SOURCE%" "%CIBLE%" /E /XO /R:1 /W:1 /LOG+:"%CIBLE%\journal.txt"
if %ERRORLEVEL% GEQ 8 echo Echec de la sauvegarde, consulter le journal.
pause

/E copie les sous-dossiers, y compris vides. /XO ignore les fichiers source plus anciens que ceux déjà présents à destination, donc la deuxième exécution ne recopie que ce qui a changé. /R:1 et /W:1 sont les deux options que tout le monde oublie : par défaut, robocopy retente un million de fois avec trente secondes d’attente entre chaque essai. Un seul fichier verrouillé par un traitement de texte ou par une synchronisation en cours immobilise alors le script pendant près de 347 jours.

Le test de code retour mérite aussi une explication, parce qu’il est faux presque partout. robocopy considère les valeurs 0 à 7 comme des succès, 0 signifiant simplement « rien à copier ». Un if errorlevel 1 classique annoncerait donc une panne à chaque sauvegarde réussie. Le seuil correct est bien 8.

Le test sans risque tient en deux caractères. Ajouter /L à la ligne robocopy demande la liste de ce que le script ferait, sans copier, sans supprimer et sans modifier le moindre horodatage. On lance, on lit le journal, on vérifie que les chemins sont les bons, puis on retire /L. C’est la seule façon honnête d’essayer un script de fichiers avant de lui confier des données.

Deux pièges d’enregistrement pour finir. Dans le Bloc-notes, « Enregistrer sous » impose de choisir « Tous les fichiers » et d’entourer le nom de guillemets, sinon le fichier repart en script.bat.txt. Et surtout, ne jamais choisir le format « Unicode » : enregistré en UTF-16, un .bat échoue dès sa première ligne avec un message du type '■@' n'est pas reconnu, parce que l’octet nul du marqueur d’ordre est lu comme une fin de fichier. Depuis Windows 10 version 1903, le Bloc-notes enregistre en UTF-8 par défaut, alors que la console française tourne en page de code 850. D’où la ligne chcp 65001 en deuxième position, sans laquelle tous les accents partent en caractères illisibles.

Batch ou PowerShell : lequel pour quoi

PowerShell fait mieux presque tout. Il manipule des objets et non du texte, il sait lire un CSV ou un JSON sans bricolage, il gère les erreurs avec un vrai try/catch, il parle aux services et au registre proprement. Et il est nettement plus prudent : une stratégie d’exécution conditionne le chargement des scripts, si bien qu’un .ps1 non signé venu d’Internet reste bloqué tant qu’il n’a pas été explicitement débloqué. Détail révélateur, un double-clic sur un .ps1 ouvre le Bloc-notes. Exactement l’inverse du .bat, et le choix est délibéré.

On lit souvent que le batch est mort. C’est partiellement vrai : plus personne n’écrit d’outil sérieux en batch, et personne ne devrait. Mais cmd.exe est présent sur toutes les installations de Windows sans exception, y compris sur les postes d’entreprise verrouillés où PowerShell est restreint. Un .bat de quatre lignes se colle dans une tâche planifiée, dans un raccourci ou dans un installeur, et se comporte pareil sur un poste de 2012 et sur Windows 11. Aucune stratégie à ajuster, aucune signature à obtenir, aucun module à installer.

La ligne de partage est simple. Copier des fichiers, appeler un exécutable, servir de colle entre deux outils : le batch suffit et reste plus lisible. Lire un format structuré, filtrer un résultat, traiter proprement une erreur ou piloter un service : PowerShell, sans hésiter.

Un .bat n’est donc ni dangereux ni obsolète. C’est un format qui agit au lieu de s’afficher, et qui ne demande jamais si on est sûr. Lire avant de lancer, tester à blanc avant de confier des données, et la moitié des mauvaises surprises disparaît.