Mes problèmes (et mes solutions) avec Windows

 L e terme de «problèmes» n'est pas tout-à-fait juste, disons plutôt: ce que je veux faire «sous Windows» et qui ne se fait pas tout seul mais que finalement j'arrive à faire. Enfin, le plus souvent… En général, «ce que je veux faire» s'oriente du côté de MS-DOS, ou a à faire avec la «base de registre», ou autres fichiers de configuration du système ou des programmes. Mes solutions s'appliquent le plus souvent à toutes les versions de Windows depuis "98" jusqu'à "XP", mais dans les cas de solutions valables pour telle version seulement je le préciserai.


I - Quelques indications préalables

Ci-après, je parlerai de quelques éléments de Windows ou du MS-DOS, tels la «base de registre», les «fichiers de commandes», etc., qui je pense méritent une présentation. Si vous désirez éviter cette partie, vous pouvez aller directement vers la partie suivante.

  1. La base de registre.
    C'est une sorte de base de données dans laquelle Windows et les logiciels qu'on y installe créent des informations utiles à leur fonctionnement. Pour leur plus grande part, ces informations sont créées et modifiées automatiquement en passant par les options de configuration du système et des programmes, mais parfois il y a nécessité à les créer ou modifier directement, en «éditant la base de registre» ou en créant un fichier de mise à jour. Il est déconseillé – à juste titre – de faire ce genre de choses, ça peut empêcher votre système ou vos programmes de fonctionner correctement, voire de fonctionner tout court. Donc, prudence, prudence…
    Il y a donc deux manières de modifier cette base de registre, directement ou par le biais d'un fichier de type "reg"; la première est plus simple, la seconde plus sûre.
    Pour «éditer la base de registre» il suffit d'éxecuter le programme "regedit.exe", soit dans l'explorateur Windows, soit en passant par le menu "Démarrer", option "Exécuter", et en y entrant "regedit" ou "regedit.exe". Pour en savoir plus sur la base de registre et sur regedit.exe, je vous conseille une recherche sur Internet, disons ici simplement que quand, par après, j'écrirai «éditer la base de registre» ça signifiera précisément cela: exécuter le programme regedit.
    Un «fichier de registre» est donc un fichier de type "reg", qui consiste en un fichier texte spécial, de la forme suivante (exemple donné: "htmledit-c-omh.reg", partiel):
    REGEDIT4
    
    ; Crée une entrée générique "htmledit.exe" associant une clé de
    ; ce nom avec la commande "shell" équivalente.
    
    [-HKEY_CLASSES_ROOT\Applications\htmledit.exe]
    [HKEY_CLASSES_ROOT\Applications\htmledit.exe]
    [HKEY_CLASSES_ROOT\Applications\htmledit.exe\shell]
    [HKEY_CLASSES_ROOT\Applications\htmledit.exe\shell\edit]
    @="Mo&difier"
    [HKEY_CLASSES_ROOT\Applications\htmledit.exe\shell\edit\command]
    @="\"C:\\progs\\Htmledit\\Htmledit.exe\" \"%1\""
    
    ; Permet de faire reconnaître HTMLEdit comme un des éditeurs
    ; HTML acceptés par les options Internet, onglet "Programmes".
    
    [HKEY_CLASSES_ROOT\.htm\OpenWithList\htmledit.exe]
    
    ; Remplace l'entrée standard "Ouvrir avec Htmledit" des menus
    ; contextuels de l'explorateur Windows par l'entrée "Htmledit"
    ; pour les types de fichiers généralement associés au programme
    
    [-HKEY_CLASSES_ROOT\aspfile\shell\Ouvrir avec Htmledit]
    [-HKEY_CLASSES_ROOT\aspfile\shell\Htmledit]
    [HKEY_CLASSES_ROOT\aspfile\shell\Htmledit]
    [HKEY_CLASSES_ROOT\aspfile\shell\Htmledit\command]
    @="\"C:\\progs\\Htmledit\\Htmledit.exe\" \"%1\""
    
    [-HKEY_CLASSES_ROOT\CSSfile\shell\Ouvrir avec Htmledit]
    [-HKEY_CLASSES_ROOT\CSSfile\shell\Htmledit]
    [HKEY_CLASSES_ROOT\CSSfile\shell\Htmledit]
    [HKEY_CLASSES_ROOT\CSSfile\shell\Htmledit\command]
    @="\"C:\\progs\\Htmledit\\Htmledit.exe\" \"%1\""
    
    
    ♦ La première ligne indique la «version de l'éditeur»; pour Windows 95 et 98, cette ligne est obligatoirement "REGEDIT4", pour les versions suivantes de Windows elle peut être "Windows Registry Editor Version 5.00", mais sauf cas particuliers (modifications de la base propres à Windows 2000 et suivants), le plus souvent "REGEDIT4" est suffisant.
    ♦ Toute ligne commençant par un point-virgule est un «commentaire», une ligne dont le programme de modification ne tient pas compte, et qui serventt à informer les potentiels lecteurs du fichier de ce que font les lignes de modification.
    ♦ Les lignes entre crochets indiquent une «clé de la base de registre». La première partie, qui commence par "HKEY", indique la section à modifier (là encore, pour plus d'informations, voir sur Internet). Il y en a cinq:
    • HKEY_CLASSES_ROOT: Les «informations de base» du système (types de fichiers avec les programmes et commandes associés, pour l'essentiel);
    • HKEY_CURRENT_USER: Tout ce qui concerne la configuration du système propre à l'actuel utilisateur de la machine;
    • HKEY_LOCAL_MACHINE: Les éléments de configuration logicielle propres à la machine où on lance le programme "regedit" (configuration de Windows et des programmes installés);
    • HKEY_USERS: Les éléments de configuration logicielle communs à tous les utilisateurs;
    • HKEY_CURRENT_CONFIG: Les éléments de la configuration matérielle et des programmes du système en charge de la gestion de ce matériel.
    Il est très vivement conseillé de ne pas modifier les entrées des deux dernières sections directement, et d'en passer par le système ou les programmes. Très vivement… Autant un problème du à une modification dans les autres sections est en général correctible, autant dans ces deux là, ça peut provoquer une erreur qui bloquera Windows ou l'empêchera de démarrer.
    ♦ Une ligne entre crochets commençant par le signe moins ("-") indique: supprimer la clé et tout ce qu'elle contient.
    ♦ Il y a trois sortes d'entrées: les «clés», les «entrées» proprement dites, et les «valeurs»; si vous lancez "regedit" vous verrez comment ça se passe: les «clés» forment une liste similaire à celle des dossiers dans l'explorateur Windows; chaque clé peut, à la manière des dossiers, contenir d'autres clés ou des entrées; les entrées forment, à la manière de l'explorateur toujours, des listes similaires à celles des fichiers; enfin, chaque entrée contient une et une seule valeur, qui peut être de trois types:
    • Chaîne: chaîne de caractères (texte);
    • Binaire: numérique de type binaire (comporte seulement des "0" et de "1", des «valeurs binaires»);
    • DWORD: numérique "double word" ("double mot"), qui correspond à une valeur numérique entière «normale» (décimale) allant sur la plupart des systèmes Windows actuels de -2.147.483.648 à +2.147.483.647[1].
    ♦ Les autres lignes indiquent une «donnée de valeur». Considérez cette partie,
    [-HKEY_CLASSES_ROOT\Applications\htmledit.exe]
    [HKEY_CLASSES_ROOT\Applications\htmledit.exe]
    [HKEY_CLASSES_ROOT\Applications\htmledit.exe\shell]
    [HKEY_CLASSES_ROOT\Applications\htmledit.exe\shell\edit]
    @="Mo&difier"
    [HKEY_CLASSES_ROOT\Applications\htmledit.exe\shell\edit\command]
    @="\"C:\\progs\\Htmledit\\Htmledit.exe\" \"%1\""
    
    la première ligne supprime, si elle existait, la clé ou une entrée "htmledit.exe" dans la clé "Applications" de la section "HKEY_CLASSES_ROOT"; la deuxième crée ou recrée une clé "htmledit.exe"; la suivante une clé "shell" sous "htmledit.exe", cette d'après une clé "edit" sous "shell", celle d'après une entrée "@" de valeur "Mo&difier" sous "shell".
    L'entrée "@" est spécifique et indique la «valeur par défaut», mais on peut créer des entrées autres, comme dans le cas suivant, inventé pour l'occasion:
    [HKEY_CLASSES_ROOT\Applications\machinchose]
    [HKEY_CLASSES_ROOT\Applications\machinchose\shell]
    "FriendlyCache"="machinchose"
    "FriendlyCacheCTime"=hex:e0,09,56,d0,90,d5,c6,01
    
    Incidemment, quand elle n'est pas explicitement indiquée l'éditeur de la base crée automatiquement une «entrée par défaut» de clé, indiquée comme "valeur non définie". On voit ici un «type de donnée» nouveau, car d'usage spécial, qu'on ne peut créer dans lançant "regedit" et qui réclame des connaissances plus approfondies de cette base de registre, le type "hex", ou «hexadécimal», une variante du type "binaire". Cela n'est pas utile pour une utilisation sommaire de la base, tel qu'ici.
    ♦ L'intérêt des fichiers "reg" est que si vous modifiez la base de registre pour y inclure une clé répondant à vos besoins, si par après vous réinstallez votre système ou voulez modifier la donnée, il vous suffit de cliquer sur le fichier en question ou de «l'importer» à partir de "regedit" pour mettre à jour la base.
    Nul besoin d'être expert pour créer un tel fichier, il suffit de lancer "regedit", d'y chercher la clé qui vous intéresse, de cliquer sur elle, puis de «l'exporter» (menu "Registre", option "Exporter un fichier du registre"). Ensuite, vous pouvez éditer le fichier "reg" créé, s'il y a lieu le modifier, puis le «fusionner» à la base de registre en (double-)cliquant dessus.
    ♦ La majeure partie des modifications qui peuvent vous convenir se font sans en passer par ces procédures directes, par exemple, si vous désirez associer des fichiers avec un programme et ajouter une option dans le menu qui apparaît quands on clique sur un fichier avec le bouton droit de la souris, il suffit d'ouvrir le panneau des «options de dossiers» (menus "Affichage" ou "Outils" de l'explorateur), puis l'onglet "Types de fichiers", de repérer dans la liste le type qui vous intéresse, puis de cliquer sur le bouton "Modifier" dans Windosw 95/98/ME, "Avancées" dans Windows 2000/XP, et d'ajouter une "action" en cliquant sur "Nouveau".
    À noter que si vous faites cela, il ne faut pas oublier d'ajouter, à la fin de la ligne qui réfère au programme choisi, la mention "%1", qui signifie ici «le nom du fichier à ouvrir», et de le faire avec les guillemets, comme dans mon exemple de fichier "reg":
    [HKEY_CLASSES_ROOT\Applications\htmledit.exe\shell\edit]
    @="Mo&difier"
    [HKEY_CLASSES_ROOT\Applications\htmledit.exe\shell\edit\command]
    @="\"C:\\progs\\Htmledit\\Htmledit.exe\" \"%1\""
    
    Cet exemple reviendrait, dans le panneau "Action", à indiquer comme "action" «Mo&difier» et comme "application utilisée" «"C:\progs\Htmledit\Htmledit.exe" "%1"». Vous aurez pu noter dans mes exemples la présence insolite du caractère "\" à certains endroits, c'est un «caractère d'échappement» qui indique que le caractère suivant doit être considéré comme une partie de la chaîne de caractères; cela est nécessité par le fait que certains caractères comme les guillemets ou les «slashes» ("\" et "/") sont considérés par l'éditeur comme des «délimiteurs». Pour exemple, la ligne indiquée,
    "\"C:\\progs\\Htmledit\\Htmledit.exe\" \"%1\""
    
    figure dans la base de registre, quand on passe par "regedit", comme:
    "C:\progs\Htmledit\Htmledit.exe" "%1"
    
    Pour conclure sur la base de registre, sa manipulation directe n'est pas conseillée mais parfois nécessaire. Il n'y a notamment pas d'autre manière d'indiquer dans les «options Internet» concernant spécialement «Microsoft Internet Explorer» un éditeur de fichiers (panneau "Options Internet", onglet "Programmes", entrée "Éditeur HTML"), ce qui oblige, dans le cas où l'on voudrait en utiliser un autre que ceux standards (le plus souvent, le bloc-notes, Word ou, s'il est installé, le traitement de texte d'une suite logicielle alternative, Open Office ou Star Office). Il faut donc le faire en passant par "regedit" ou par un fichier "reg" idoine.

  2. Les fichiers de commande MS-DOS.
    Ce sont des fichiers de type "bat", des fichiers texte contenant une liste de commandes MS-DOS, ainsi que certaines commandes et indications propres à ce fichiers. Ils contiennent donc surtout des commandes DOS, un terme qui désigne les programmes (les commandes «externes») ou des fonctions du système (les commandes «internes»). Par exemple, les commandes "dir" (liste des dossiers), "cls" (remise à zéro de l'affichage), "date", "time" sont des fonctions du système, alors que des fonctions de base comme "format", "attrib", "mode", sont des commandes externes; et bien sûr, toute «application» (c.-à-d., tout fichier de type "exe", "com" ou "bat") est considérée comme une «commande externe». Pour l'utilisateur (vous ou moi), savoir si une commande est externe ou interne a peu d'importance, sinon qu'une commande externe doit se trouver dans certains emplacements précis, les «répertoires par défaut», que l'on peut connaître, sous DOS, en entrant la commande (interne…) "path", sous windows, en lançant le programme "Informations système" (dans les "outils système"), branche "Environnement logiciel", sous-branche "Variables d'environnement", ligne "path". Dans celle ligne, chaque sous-élément délimité par un point-virgule indique (censément) un dossier où le système recherchera des commands externes.
    Les commandes propres aux fichiers de commandes sont peu nombreuses:
    • echo sert à envoyer la ligne à «échoïser» vers une «sortie» (par défaut, vers l'écran, mais ça peut être "redirigé", voir par après). Il y a deux sous-commandes, "echo off" et "echo on" qui diffèrent un peu de la commande echo générale. Par défaut, les lignes d'un fichier de commande sont affichées à l'écran, «échoïsées»; la commande "echo off" annule la chose, celle "echo on" la rétablit; dans la situation "echo off", seules les lignes commençant précisément par "echo" seront affichées.
    • pause permet de suspendre l'exécution d'un fichier de commandes; elle affiche la ligne "Appuyez sur une touche pour continuer..." ou "Appuyez sur n'importe quelle touche pour continuer...", ça dépend de la version du système. Sous Windows elle est de peu d'usage, sauf si le fichier de commande ne fait pas ce qu'on désire, et dans ce cas elle permet, en suspendant son déroulement, de lire les messages d'erreur qui pourraient expliquer ce défaut d'exécution.
    • goto permet de «brancher l'exécution» vers une ligne particulière. Cette commande requiert l'existence dans le fichier d'une ligne de destination commençant par le caractère «deux-points» (":"). Pour exemple, un fichier tel que
      echo off
      echo on va à la fin
      goto fin
      echo rien ne se fait ici et ces lignes
      echo ne seront pas affichées du tout.
      :fin
      
      aura le résultat suivant, si il est exécuté sur le disque dur "C:":
      c:\>echo off
      c:\>on va à la fin
      c:\>
      
      L'intérêt de "goto" sera vue plus loin avec la «commande conditionnelle» et les «retours de tests». La ligne, "echo off" est affichée puisque présente avant la commande de même… Et justement,
    • Le caractère "@" en début de ligne sert à inhiber l'affichage de la ligne; par exemple, dans le cas précédent la ligne "echo off" eut-elle été "@echo off", le système ne l'aurait pas affichée.
    • rem désigne une «remarque», une ligne qui sera ignorée, bref une sorte de «non commande». Cela permet de commenter les autres lignes ou, quelquefois, d'expliquer à quoi est destiné tel fichier de commande particulier.
    • if est la «commande conditionnelle» indiqués plus haut, elle signifie «si» en anglais, et c'est précisément son objet, «si ceci [alors] cela». Contrairement à ce qui se pratique dans les langages de programmation, le «alors» est implicite, tout simplement par que dans les fichiers de commandes on ne peut indiquer qu'une seule condition. Une séquence conditionnelle ressemble par exemple à ceci:
      if %1==toto goto titi
      echo %%1 vaut %1
      goto fin
      :titi
      echo %%1 vaut %1
      :fin
      
      Un exemple qui m'oblige à parler tout de suite des «variables remplaçables».
    • Variables remplaçables. Une telle variable commence par "%" ou par "%%" et se termine, pour certaines, par "%". Il existe trois types de variables remplaçables:
      • Les paramètres de ligne de commande;
      • Les variables d'environnement;
      • Les variables transitoires.
      Les premières désignent les mentions ajoutées après le nom d'un fichier de commande sur la ligne (réelle ou virtuelle) d'où il est exécuté. Il y en a au plus dix, de 0 à 9, mais on peut «tricher» là-dessus; le paramètre 0 est le nom même du fichier de commande (et de toute commande externe, d'ailleurs), les autres chaque élément simple ou délimité par des guillemets qui suit ce nom. Dans un fichier de commande, la référence à ces paramètres se fait en indiquant leur numéro d'ordre précédé du signe "%". P. ex., "%2" désignera "titi" dans une ligne telle que
      C:\>test.bat toto titi tutu
      Les «variables d'environnement» sont celles qu'on peut obtenir, sous MS-DOS en tapant la commande "set", sous Windows en consultant la partie des "Informations système" déjà indiquée, "Variables d'environnement" dans "Environnement logiciel". Avec "set", elles sont indiquées sous la forme "nom=valeur", par exemple,
      SystemRoot=C:\WINNT
      Dans un fichier de commande, ces variables sont mentionnées par le nom encadré par les signes "%" et «renvoient» la valeur qui leur est associée. Une ligne comme
      echo Le répertoire du système est %SystemRoot%
      donnera cet affichage:
      Le répertoire du système est C:\WINNT
      Les variables transitoires «existent» pour une seule ligne, celle elles sont créées, et commencent avec la séquence "%%" suivie d'un nom. Elles ne s'utilisent qu'avec la «commande de boucle» "for", qu'on verra après. Exemple d'usage:
      for %%var in (patin couffin truc bidule "et toute la suite") do echo %%var
      Cela donnera à l'exécution cette série de lignes,
      patin
      couffin
      truc
      bidule
      et toute la suite
      
      et revient en gros à un fichier de commande tel que:
      echo patin
      echo couffin
      echo truc
      echo bidule
      echo et toute la suite
      
      Les différents usages du "%" servent précisément au système pour différencier les trois types de variables. En outre, on ne peut en aucun cas utiliser un chiffre arable simple comme variable transitoire, puisqu'ils sont réservés aux variables paramètres. Enfin, si on fait précéder une variable paramètre, précéder et suivre une variable d'environnement de deux signes "%", au lieu d'afficher sa valeur le système affichera son nom. Un fichier "test.bat" tel que
      @echo off
      echo le paramètre %%2 équivaut à %2
      echo la variable %%SystemRoot%% pointe le répertoire %SystemRoot%
      
      donnerait, avec la ligne de commande
      test.bat titi toto tutu
      
      le résultat suivant:
      le paramètre %2 équivaut à toto
      la variable %SystemRoot% pointe le répertoire C:\WINNT
      
      Dans le cas, bien sûr, où votre système Windows est installé dans le dossier C:\WINNT.
    • commandes de contrôle. Il y en a trois: "goto", déjà décrite, "if" et "for" que j'ai brièvement évoquées. Contrairement à "goto", une commande simple avec une seule action liée, aller à («to go to», en anglais) une certaine ligne, "if" et "for" sont des commandes complexes formées de trois parties: la commande, le paramètre et l'action à exécuter. "if" sert à conditionner l'exécution d'une action au résultat d'un test, "for" à exécuter plusieurs fois la même action. On peut aussi combiner deux de ces commandes: l'action d'un "if" peut être un "for" ou un "goto", l'action d'un "for" peut être un "if" (mais pas un "goto", car on ne peut pas «aller à une ligne» plusieurs fois de suite sur la même ligne de départ…).
      • La commande "if". Elle est elle-même liée par plusieurs autres commandes et à des «variables système» créées dynamiquement par des commandes internes ou externes. Les commandes et variables utilisées par "if" sont:
        • exists: vérifie l'existence d'un fichier ou d'un dossier;
        • errorlevel: «niveau d'erreur», une valeur créée par une commande ou générée par le système quand une commande n'a pu être exécutée correctement
        • «valeur de variable»: teste l'équivalence entre une variable d'environnement ou paramètre et la valeur en regard.
        Factuellemnt, la «valeur de test» est binaire, booléenne: «vrai» ou «faux». Si «vrai» alors «faire ceci», si «faux» alors ne rien faire. Les deux usages courants de "if" sont l'exécution conditionnelle d'une ou plusieurs commandes et le branchement conditionnel. Pour un exemple concret, le «fichier de menu» qui me servait au démarrage de Windows 98:
        1. @echo off
        2. if %1.==. goto menu
        3. goto %1
        4. :menu
        5. be c:\user\menu.be
        6. if errorlevel==9 boot
        7. if errorlevel==7 jeux
        8. if errorlevel==5 scallbe
        9. if errorlevel==3 goto sc
        10. if errorlevel==1 goto win
        11. goto fin
        12. :win
        13. ECHO Démarrage de Windows
        14. %winbootdir%\win.com
        15. menu
        16. :sc
        17. call sc
        18. menu
        19. :fin
        20. echo.
        21. echo Fin du traitement...
        22. echo.
        J'ai numéroté les lignes pour la commodité de l'explication. Pour précision, la commande externe "be" est un programme permettant de créer une sorte de menu, tel que celui-ci, défini dans le fichier "menu.be":


        On lui passait aussi en paramètre une liste de «lettres-clé» auquelles était attachée une valeur dans l'ordre de la liste (la première «valait» 1, la deuxième, 2, etc.) et l'appui sur la touche "Echap" «valait» 0 (zéro). Cette valeur était renvoyée dans la variable système "errorlevel", Ce qui explique les tests sur cette variable.
        L'intérêt de ce fichier de commandes vient de ce qu'il montre beaucoup des usages qu'on peut faire de "if" et de la combinaison, immédiate ou successive, des commandes "if" et "goto". Il montre aussi deux phénomènes utiles: la «récursivité» et la «réentrance».
        La première ligne teste… l'inexistence de la variable "%1". Cela se fait d'une manière spéciale, car on n'a pas le droit d'indiquer une «non valeur» après le signe "=" d'un test, d'où la forme "if %1.==. goto menu". Si j'avais indiqué "if %1== goto menu", soit le système aurait estimé que la valeur testée était "goto", soit qu'il n'y avait pas de valeur testée, et dans les deux cas aurait renvoyé une erreur et arrrêté l'exécution du fichier de commande. Ici, dans le cas où "%1" n'est pas défini, l'interprétation du système sera "if .==.", ce qui évite l'erreur. Le but de cette ligne est de définir «l'action de base» à entreprendre: «aller au menu».
        La deuxième ligne illustre la récursivité et fonctionnait en combinaison avec d'autres lignes, dans une version précédente du menu. Pour un exemple effectif de récursivité, le fichier de commandes "jeux.bat" indiqué ligne 9:
        1. if %1.==. goto menu
        2. goto %1
        3. :menu
        4. be c:\user\jeux.be
        5. if errorlevel==18 jeux exec dos\Prince2 PRINCE.EXE
        6. if errorlevel==17 jeux exec dos\Hocus HOCUS.EXE
          […]
        7. if errorlevel==8 jeux exec dos-pur\links CALL LINKS.BAT
          […]
        8. if errorlevel==3 jeux exec dos\Summ2DOS SUMMERG2.EXE
        9. if errorlevel==2 jeux exec dos\CapFlag CAPFLAG.EXE
        10. if errorlevel==1 jeux exec dos\Pipe PIPE.EXE
        11. menu
        12. :exec
        13. shift
        14. i:
        15. cd \jeux
        16. cd %1
        17. shift
        18. %1 %2 %3 %4 %5 %6 %7 %8 %9
        19. c:
        20. jeux
        Si le «niveau d'erreur» est compris entre 18 et 1,, l'action consitera à «appeler» la commande "jeux.bat", c.-à-d., celle en cours d'exécution, mais cette fois-ci avec les paramètres associés au niveau d'erreur; dans ce cas, %1 sera différent de rien, et la deuxième ligne, "goto %1", sera exécutée. Ici, "%1" vaut toujours "exec", ce qui revient à la commande "goto exec", et branche l'exécution à la ligne 14. On voit ligne 15 l'exemple de ce dont je parlais, «tricher avec le nombre de paramètres»: la commande "shift" retire le paramètre 1 de la liste, et le paramètre 2 «devient» le 1; suivent les commandes de cette «branche», et à la fin, ligne 22, l'illustration de la «réentrance»: le fait d'appeler la commande "jeux.bat" sans paramètres revient à mettre la commande dans son état initial, l'appel simple, ce qui revient à «réentrer» dans la commande comme si rien n'avait eu lieu auparavant.
        La réentrance est le cas normal lorsqu'un fichier de commande se réfère à lui-même, et on peut dire que la récursivité, dans ce cas, est une manière habile de tourner ce problème en corrigeant ce comportement grâce aux paramètres ajoutés. Pour éviter ce problème, en fait un problème plus large, si un fichier de commandes «appelle» un fichier de commande (lui-même ou un autre) son exécution est arrétée, les concepteurs du MS-DOS ont introduit tardivement la commande "call", illustrée ligne 8: elle permet le retour vers le fichier de commande appelant après la fin de l'exécution du fichier appelé.
        Tout ça peut sembler compliqué mais est assez simple. Prenons le cas où, après affichage du menu "jeux.be", on presse sur la touche "S", troisième de la liste des touches passée au programme "be.exe"; il renvoie le niveua d'erreur 3; les tests sur les valeurs 18 à 4 échouent, donc les actions ne sont pas exécutés; celui sur 3 réussi, donc l'action "jeux exec dos\Summ2DOS SUMMERG2.EXE" est exécutées, ce qui appelle donc le fichier "jeux.bat" mais cette fois-ci avec les paramètres "exec dos\Summ2DOS SUMMERG2.EXE"; le test de la première ligne échoue ("%1" valant "exec"), et c'est donc la ligne suivante qui sera exécutée, qui vaudra ici "goto exec", ce qui branche vers la ligne 14. Première action, "shift", ce qui transforme la liste des paramètres en "dos\Summ2DOS SUMMERG2.EXE"; puis la commande "i:" indique au système de rendre le lecteur "i:" «lecteur par défaut»; la ligne suivante commande de changer le «répertoire par défaut» vers "i:\jeux", celle d'après vers "%1", c.-à-d. ici "dos\Summ2DOS", ce qui revient à "i:\jeux\dos\Summ2DOS" (évidemment, s'il n'existe pas, on aura un message d'erreur «commande iconnue ou nom de fichier inconnu»); ensuite, élimination du paramètre 1 puis «exécution» du paramètre 2 suivi de tous les autres (dans notre cas, aucun). Enfin, retour vers le lecteur "C:" où se trouve "jeux.bat" et en dernier, réentrée dans "jeux.bat". Bref, malgré les apparences tout ça n'est pas si ardu.
        Précision: le test de "errorlevel" est «vrai» pour la valeur testée et pour toutes les valeurs supérieures, ce qui signifie que si l'on crée trois lignes telles que
        if errorlevel==1  jeux exec dos\Pipe PIPE.EXE
        if errorlevel==2  jeux exec dos\CapFlag CAPFLAG.EXE
        if errorlevel==3  jeux exec dos\Summ2DOS SUMMERG2.EXE
        
        dans les cas où "errorlevel" vaut 2 ou 3, les actions associées ne seront jamais lancées. Raison pour laquelle, dans mon exemple, les tests se font de la valeur 18 à la valeur 1 en décroissant.
        "exists" et «valeur de variable» sont plus simples. Pour le second cas on a l'exemple de "if %1.==. goto menu", qui pourrait être "if %1==test goto menu" ou "if %1==retour echo %%1 vaut %1". On peut aussi utiliser les variables d'environnement (p. ex., "if systemroot==C:\WINDOWS goto win"), mais on peut aussi tester comme «valeur» une variable ou un paramètre (par exemple, on peut faire le test "if systemroot==%1" ou "if %1==%systemroot%").
        À signaler que, contrairement à ce qui se passe en général avec MS-DOS et MS-Windows, les tests de variables sont font la différence entre minuscules et majuscules, donc "if %1==a" rendra «faux» si "%1" «vaut» "A".
        "exists" s'utilise ainsi: "if exists <nom de fichier> <action>". C'est tout. Et si le fichier ou dossier n'existe pas, bien évidemment l'action ne sera pas exécutée.
      • La commande "for". Elle comporte plusieurs parties, dans un ordre fixe, selon le schéma suivant:
        for <variable> in (<liste>) do <action>
        En général, la variable est mentionnée dans l'action, mais ça n'est pas obligatoire. Le principe est d'appliquer une certaine commande à la série d'éléments de la liste, la variable prenant la valeur de chaque élément dans l'ordre où on les donne. Par exemple,
        for %%v in (01 02 03 04 05 06 07 08 09) do ren t3-ch%%vrec.htm t3-ch%%v.htm
        revient à la série de commandes
        ren t3-ch01rec.htm t3-ch01.htm
        ren t3-ch02rec.htm t3-ch02.htm
        ren t3-ch03rec.htm t3-ch03.htm
        ren t3-ch04rec.htm t3-ch04.htm
        ren t3-ch05rec.htm t3-ch05.htm
        ren t3-ch06rec.htm t3-ch06.htm
        ren t3-ch07rec.htm t3-ch07.htm
        ren t3-ch08rec.htm t3-ch08.htm
        ren t3-ch09rec.htm t3-ch09.htm
        
        Comme presque tous les autres, cet exemple provient d'un cas réel.
        Comme dans le cas de "errorlevel", il y a différenciation entre minuscules et majuscules pour le nom de la variable, ce qui implique que "%%v" n'équivaut pas à "%%V".
    • shift a été vu, et consiste à éliminer le premier paramètre de la ligne de commandes. On aurait pu concevoir un fichier de commande "test.bat" de la sorte:
      :debut
      if %1.==. goto fin
      ren t3-ch%1rec.htm t3-ch%1.htm
      shift
      goto debut
      :fin
      
      La ligne de commande serait alors
      test.bat 01 02 03 04 05 06 07 08 09
      Le résultat similaire à celui de la commande "for" exposée plus haut. Ce n'est cependant pas l'usage premier de la commande, elle remédie à la limite du nombre de paramètres, qui est donc de 9 (outre le nom de la commande); dans mes exemples on voit comment en user: quand j'appelle la commande "jeux.bat" pour lancer un jeu, il y a deux paramètres «transitoires», celui du "goto" et celui indiquant le dossier du jeu; je les élimine l'un après l'autre une fois leur usage passé, ce qui me permet alors de pouvoir disposer de nouveau de 9 paramètres «utiles».
    • Quelques commandes externes. Il existe plusieurs commandes externes qui ont leur utilité essentiellement dans ce cadre des fichiers de commandes.
      • choice permet un «choix» simple: "oui" ou "non". Il y a plusieurs paramètres que vous pouvez découvrir en entrant "choice /?" sur une ligne de commande. L'usage de base en est simple:
        choice <texte>
        
        Par exemple,
        choice Lancer le programme tartempion
        
        qui aura pour résultat à l'affichage:
        Lancer le programme tartempion (O/N) ?
        
        Le programme attend l'appui de "O" ou "N"; avec "N" il retourne un "errorlevel" de valeur 1, sinon de valeur 0; donc le "if" qui suit ce "choice" s'applique à l'option négative. Par exemple, le fichier "menu.bat" aurait pu être ainsi:
        choice Démarrer Windows 98
        if errorlevel==1 goto suite
        win
        goto fin
        :suite
        choice Lancer le programme Star Commander
        if errorlevel==1 goto fin
        sc
        :fin
        
        Il fut d'ailleurs ainsi, pendant un moment.
    • Commandes diverses. Plusieurs commandes, internes ou externes, sont utiles aux fichiers de commandes sans leur être spécifiques, comme "cls", "mode", etc.
      • cls. Signifie «clear screen», «effacer l'écran»; fort heureusement, elle ne fait pas cela et se contente d'en effacer le contenu affiché.
      • mode. Commande de multiple usage. Elle permet de modifier le comportement de «périphériques d'entrée-sortie»: écran, imprimantes, ports de communication. Entrée sans paramètres, elle donne l'état de ce périphériques. Exemple, sur ma machine:
        C:\WINNT>mode
        
        État du périphérique LPT1:
        --------------------------
            La sortie imprimante n'est pas redirigée.
        
        
        État du périphérique COM1:
        --------------------------
            Baud :            1200
            Parité :          None
            Bits de données :  7
            Bits d'arrêt :    1
            Temporisation :   OFF
            XON/XOFF :        OFF
            Protocole CTS :   OFF
            Protocole DSR :   OFF
            Sensibilité DSR : OFF
            Circuit DTR :     ON
            Circuit RTS :     ON
        
        
        État du périphérique COM2:
        --------------------------
            Baud :            1200
            Parité :          None
            Bits de données :  7
            Bits d'arrêt :    1
            Temporisation :   OFF
            XON/XOFF :        OFF
            Protocole CTS :   OFF
            Protocole DSR :   OFF
            Sensibilité DSR : OFF
            Circuit DTR :     ON
            Circuit RTS :     ON
        
        
        État du périphérique CON:
        -------------------------
            Lignes :          50
            Colonnes :        80
            Vitesse clavier : 31
            Délai clavier :   1
            Page de codes :   850
        
        Le "périphérique CON" n'est pas un «périphérique peu intelligent» (quoi que…) mais l'ensemble des périphériques de base, ou «console»: sortie écran et entrée clavier. Les paramètres de "mode" varient selon votre système: jusqu'à Windows 98, "CON" était une indication implicite, et il y avait des «raccourcis» pour indiquer le nombre de lignes et de colonnes, par exemple "mode co80,50" était admis; avec les systèmes à base NT (NT, XP, 2000) c'est plus rigide: on doit indiquer tous les éléments, la même commande doit alors avoir la forme "mode con cols=80 lines=50". Pour connaître toutes les options de cette commande, entrer, comme souvent, "mode /?"; pour savoir comment les utiliser, c'est autre chose; encore une fois, vous trouverez ça sur Internet…


II - Les programmes MS-DOS

♦ Raccourcis MS-DOS

Premier problème en ce qui me concerne: il y a deux sortes de programmes DOS, ceux «à l'ancienne», dits "16 bits", et ceux «évolués», dits "32 bits". Avec certaines versions de Windows, les options de configuration des seconds sont bien moins nombreuses que pour les premiers, parce que les système les considère comme des programmes Windows. Le truc pour remédier au problème est simple:

  • Créer un «fichier de commandes» (fichier du type "bat") dans le dossier du programme;
  • L'éditer et y insérer une seule ligne: le nom du programme en question;
  • Créer un raccourci sur ce fichier de commandes.

Dès lors, les options de propriété que vous appliquerez au fichier de commande créé se transmettront au programme qu'il lancera.

♦ Créer un fichier de commande sous Windows

Dans les autres pages de cette rubrique je l'indiquais déjà, je suis un programmeur à l'ancienne, les premières années où j'ai travaillé avec des ordinateurs nous n'avions que le MS-DOS comme système, et ma foi, beaucoup de choses que je fais encore sur ma machine me semblent (et souvent sont) plus simples à réaliser «sous DOS». Pour ce faire, je crée le plus souvent des «fichiers de commandes». Problème, ça demande un détour, dans un environnement Windows, comme créer un fichier texte, le renommer "mon fichier.bat", puis l'éditer. Ça m'ennuyait parce que ça provoque systématiquement un message d'erreur, et aussi que ça fait des étapes intermédiaires inutiles. La solution est de créer une entrée de la «base de registre» telle qu'on puisse créer directement un fichier du type désiré.


[1] Dans les versions les plus récentes, dites «64 bits», cela va d'environ -9.2 milliards de milliards à +9.2 milliards de milliards et précisément, de -9.223.372.036.854.780.000 à +9.223.372.036.854.779.999; en sens inverse, dans les versions anciennes dites «16 bits», ça allait de -32.768 à +32.767. Cette variabilité est due au départ au matériel: quand les premières versions de Windows furent réalisés les ordinateurs ne savaient traiter que des données numériques élémentaires, des «mots», de 8 bits, soit 256 valeurs; donc un «double mot» comportait 16 bits ou 65.536 valeurs différentes; plus tard (en 1989) les processeurs pour ordinateurs PC évoluèrent et les données élémentaires furent de 16 bits, donc le «double mot» de 32 bits, soit 4.294.967.296 valeurs possibles; plus récemment (deuxième moitié des années 1990), de nouveaux processeurs furent capables de manipuler des données élémentaires de 32 bits, d'où, le «mot double» comporta alors 64 bits, ou 18.446.744.073.709.600.000 valeurs possibles. Actuellement il y a des processeurs dont le mot de base est de 64 bits, et je préfère ne pas indiquer le nombre maximum de valeurs du «double mot»; en notation brève c'est 2^128, ce qui représente plus que le nombre total d'atomes de notre univers…