Dans un nouveau fichier Batch nommé Test copiez ce contenu :
@echo off
59
set répertoire=%1%
set fichier=%2%
set nombre=%3%
for /f "skip=%nombre%" %%a in ('dir /a:-d /b "%répertoire%\%fichier%"') do del %répertoire%\%%a
@echo on
En admettant que vous souhaitiez "écrémer" les 5 premiers fichiers .txt dans un répertoire Source, saisissez cette
commande : test c:\source *.txt 5. Nous définissons trois variables correspondant aux trois paramètres saisis par
l'utilisateur. Dans la sortie-écran affichée par la commande "Dir" nous "squizzons" les cinq premières lignes affichées correspondant aux cinq fichiers les plus anciens en bous servant du mot clé "skip=%nombre%". Il vous est aussi possible
d'effectuer l'opération inverse en changeant l'ordre de tri :
dir /a:-d /o:-d /b
La variable %a sera chaque nom de fichier retenu que nous reprenons pour les supprimer un à un.
- Compter le nombre d'objets présents dans un répertoire :
Dans un nouveau fichier Batch, copiez ce contenu :
@echo off
set répertoire=%1
set /a compteurA=0
set /a compteurB=0
for /f %%a in ('dir /s /b /a:-d %répertoire%\*.*') do set /a CompteurA+=1
for /f %%a in ('dir /s /b /a:d %répertoire%\*.*') do set /a CompteurB+=1
echo %CompteurA% fichiers %compteurB% dossiers
@echo on
Saisissez le nom du script suivi du nom du répertoire à explorer. Nous récupérons le paramètre saisi par l'utilisateur afin de
créer une variable nommée %répertoire%. Nous définissons deux compteurs qui sont chacun initialisés sur 0. La première
commande va compter les fichiers. Nous nous servons du commutateur /a:-d dans la commande "Dir" afin de ne pas afficher
les répertoires trouvés. La seconde commande utilise la fonctionnalité inverse de la commande "Dir".
- Supprimer le contenu d'un répertoire cible :
Dans un nouveau fichier batch copiez ce contenu :
@echo off
pushd %1
del /q "*.*"
for /f "tokens=*" %%a in ('dir /b /ad') do rd /s /q "%%a"
popd
@echo on
Saisissez le nom du fichier Batch suivi de l'emplacement et du nom du répertoire à "vider". Le répertoire "parent" restera intact tandis que l'intégralité de son contenu (fichiers et sous-répertoires) sera supprimée. Le principe est de récupérer
l'arborescence spécifiée par l'utilisateur pour "pousser" (pushd) l'indicatif à l'emplacement voulu. La commande "Del"
supprime tous les fichiers du nouveau répertoire par défaut. Nous utilisons la commande "Dir" afin de n'afficher que les
répertoires. Pour chaque occurrence trouvée, nous nous servons de la commande "Rd". La dernière ligne nous permet de
revenir à notre point de départ (popd).
- Analyser les fichiers :
Créez un nouveau fichier Batch contenant :
@echo off
set nom=%1
for /f %%a in ('find /v /c "" ^< %nom%') do set /a lignes=%%a
@echo Il y a %lignes% lignes dans le fichier %nom%
@echo on
Saisissez le nom du fichier batch suivi du nom du fichier à analyser. La seconde ligne du script nous permet de récupérer le
nom du fichier en nous servant de la variable %1 qui désigne le premier paramètre saisi par l'utilisateur à la suite de la
commande. La commande find /v /c "" affiche toutes les lignes qui contiennent autre chose que rien (""), opère un décompte
puis affiche le total (/c). En admettant que la recherche porte sur un fichier nommé Fichier.txt, vous auriez pu saisir
directement cette commande :
for /f %a in ('find /v /c "" ^< fichier.txt') do @echo Il y a %a lignes.
- Créer un fichier contenant un texte plusieurs fois répété :
60
Vous pouvez vous inspirer de cet exemple de fichier Batch :
@echo off
for %%a in (1 2 3 4 5 6 7 8 9) do echo Ligne %%a>>test.txt
@echo on
- Compter les lignes d'un fichier et en afficher un nombre déterminé :
Nous nous inspirons dans ce paragraphe et les autres scripts portant sur l'analyse des fichiers de certains exemples publiés
par Ritchie Lawrence à partir de son site Web : www.commandline.co.uk/index.html. Dans un nouveau document Batch
copiez les lignes suivantes :
@echo off
set fichier=%1
set nombre=%2
for /f %%a in ('find /v /c "" ^< %fichier%') do set /a lignes=%%a
@echo Il y a %lignes% lignes dans le fichier %fichier%.
if %nombre% geq %lignes% set /a A=0&goto Sortie
set /a A=%lignes% - %nombre%
:Sortie
more /e +%A% %fichier%
@echo on
Saisissez à la suite de votre "Batch" le nom du fichier suivi du nombre de lignes à afficher. Nous reprenons le principe du précédent Batch pour la première partie du script. Si le nombre saisi par l'utilisateur est supérieur ou égal au nombre de
lignes trouvées nous exécutons la commande spécifiée sous l'étiquette :Sortie. Dans le cas contraire, nous définissons la
variable %A comme étant le produit de la soustraction entre le nombre de lignes et le nombre spécifié par l'utilisateur puis
exécutons la dernière commande du script. Dans tous les cas, la commande "More" affiche le résultat tel que nous l'avons
voulu du contenu de notre fichier.
- Vérifier la présence d'une chaîne de caractères :
Dans un nouveau fichier Batch copiez ce contenu :
@echo off
@echo off
findstr "212.37.221.109 Microapp.com" %systemroot%\system32\drivers\etc\hosts
if %errorlevel%==0 goto Msg
echo 212.37.221.109 Microapp.com >> %systemroot%\system32\drivers\etc\hosts
goto :eof
:Msg
echo Le fichier Hosts est déjà à jour !
@echo on
Le fichier Hosts consigne un certain nombre de sites en faisant le lien entre l'adresse IP et le nom du site. Vous pouvez de
cette façon soit faciliter l'accès à un site (il ne sera pas effectué de requête auprès des serveurs DNS) ou en interdire l'accès
(en spécifiant à la suite du nom de domaine l'adresse locale de l'ordinateur). Notre script se contente de vérifier l'existence
de l'enregistrement spécifié. Si c'est le cas (if %errorlevel%==0) alors nous exécuterons les commandes indiquées sous
l'étiquette :Msg. Sinon nous ajoutons la ligne d'enregistrement dans le fichier Hosts et terminons le script par la commande
goto:eof.
- Supprimer ou remplacer une chaîne de caractères dans un texte :
Dans un nouveau fichier Batch saisissez ceci :
@echo off
for /f "delims=" %%a in ('type "%1"') do call :commande "%%a"
goto :eof
:commande
set ligne=%1
set ligne=%ligne:"=%
@echo %ligne% >>fichier2.txt
@echo on
Dans ce script nous nous proposons de supprimer tous les guillemets... Saisissez simplement le nom du script suivi du nom
du fichier à modifier. Une version expurgée sera automatiquement générée. Nous nous servons de la commande "Type" pour
afficher le contenu du fichier. Pour chaque ligne affichée par la commande "Type" nous créons une variable nommée
%ligne%. Dans cette variable nous opérons une substitution en remplaçant tous les signes " par rien ("=). La nouvelle ligne
une fois formatée, nous l'"empilons" dans un fichier nommé Fichier2.txt et ce en nous servant de la commande "Echo".
61
- Retrouver une chaîne de caractères dans différents fichiers :
Dans un nouveau fichier Batch copiez ce contenu :
@echo off
set dossier=%1
set filtre=%2
set chaîne=%3
for /f "tokens=*" %%a in ('dir "%dossier%\%filtre%" /s /b') do (
for /f "tokens=*" %%z in ('type "%%a"^|findstr /l /i /c:"%chaîne%"') do (
@echo %%ass:%%z
)
)
@echo on
La syntaxe vous permettant de lancer votre fichier Batch sera celle-ci : Nom_Batch Emplacement Nom_Fichiers Chaîne. Par
exemple et en admettant que votre fichier Batch se nomme Test.bat, si vous souhaitez savoir quels sont les fichiers texte
placés dans C:\Source qui contiennent la chaîne de caractères "Jean", saisissez :
Test c:\source *.txt Jean
Nous définissons trois variables qui correspondent aux paramètres saisis par l'utilisateur. Un jeton est alloué à chaque ligne
trouvée dans la sortie-écran de la commande "Dir". Nous obtenons à chaque fois une variable %f qui sera le nom du fichier.
Cette variable est reprise de telle sorte que "Type" puisse afficher le fichier spécifié. Un autre jeton est alloué à chaque ligne
trouvée dans le fichier analysé. La commande "Findstr" permet de filtrer que les lignes contenant la chaîne de caractères
"Jean". Les deux variables ainsi obtenues %f et %z seront affichés par la commande "Echo".
- Trouver une même occurrence dans plusieurs fichiers :
Ce fichier Batch sait le faire :
@echo off
for /f "delims=" %%a in ('findstr /m Microapp.com c:\*.*') do echo "%%a"
@echo on
- Une autre manière de supprimer les guillemets ?
Si dans un fichier .txt vous avez ce type de contenu :
ligne, 1, mot, 1
ligne, 2, mot, 2
Ces deux commandes vont nous permettre d'afficher que les chiffres ou que les chaînes de caractères :
for /f "tokens=2,4 delims=," %a in (fichier.txt) do (echo %a %b)
for /f "tokens=1,3 delims=," %a in (fichier.txt) do (echo %a %b)
Si, par contre le contenu du fichier ressemble à celui-ci :
ligne "1" mot "1"
ligne "2" mot "2"
Vous devez vous inspirer de ce fichier Batch :
@echo off
setlocal EnableDelayedExpansion
for /f "tokens=*" %%a in ('type "Fichier.txt"') do (
set ligne=%%a
echo !ligne:"=!
)>> temp.txt
for /f "tokens=1,3 delims= " %%a in (temp.txt) do (echo %%a %%b)
del temp.txt
@echo on
Tout d'abord nous précisons que nous allons nous servir des variables dynamiques. La commande "Type" permet d'afficher le
contenu du fichier. À chaque ligne trouvée est allouée une variable %a. Nous redirigeons chacune de ces lignes dans un
fichier nommé Temp.txt. Nous nous servons de la commande "Echo" et de la variable %ligne%, mais placée, cette fois-ci,
entre deux points d'exclamation. Au passage, nous opérons une substitution en remplaçant tous les guillemets trouvés par
rien (echo !ligne:"=!). Il suffit après de reprendre le fichier Temp.txt afin d'afficher son contenu "transformé". Par mesure de
"propreté" nous supprimons le fichier temporaire dont nous nous sommes servis.
62
- Afficher les informations d'un fichier :
Dans un nouveau fichier nommé Script.bat copiez ce contenu :
@echo off
set nom=%1%
for /f %%a in ('dir "%nom%" /s /b /-c /a:-d-s-h') do echo %%~za octets
for /f "skip=4 tokens=1,2" %%a in ('dir "%nom%" /tc /-c /a:-d-s-h^|find /v "(s)"') do echo Créé le %%a %%b
for /f "skip=4 tokens=1,2" %%a in ('dir "%nom%" /tw /-c /a:-d-s-h^|find /v "(s)"') do echo Modifié le %%a %%b
for /f "skip=4 tokens=1,2" %%a in ('dir "%nom%" /ta /-c /a:-d-s-h^|find /v "(s)"') do echo Dernier accès le %%a
%%b
@echo on
- Saisissez le nom du Batch suivi du nom du fichier à analyser :
Pour bien comprendre comment fonctionne ce script, comparez ces deux commandes :
@echo off
dir "fichier.txt" /tc /-c /a:-d-s-h
@echo on
@echo off
dir "fichier.txt" /tc /-c /a:-d-s-h |find /v "(s)"
@echo on
La seconde commande a biffé toutes les informations contenant la chaîne de caractères "(s)" comme celle-ci : "1 fichier(s)".
Reste maintenant à supprimer les lignes d'informations d'en-tête. C'est le pourquoi de l'emploi du mot-clé "skip=4". De cette
façon, nous n'analysons que la seconde ligne de la sortie-écran produite par la commande "Dir". Je précise que le chiffre de
4 lignes ne correspond pas à la réalité, mais, curieusement, cela fonctionne aussi bien que si nous demandons de "sauter"
les cinq premières lignes ?
- Modifier un texte :
Imaginons un fichier nommé Test.txt ayant ce contenu :
Colonne Colonne Colonne
Colonne Colonne Colonne
etc.
Nous souhaitons placer devant chaque colonne un numéro. Dans un nouveau fichier Batch, copiez ceci :
for /f "tokens=1,2,*" %%a in ('type test.txt') do echo 1 %%a 2 %%b 3 %%c > test.txt
Nous balayons à l'aide de la commande "For" le fichier spécifié en envoyant à chaque bloc rencontré le numéro de la
colonne. Si vous souhaitez revenir en arrière, créez un autre fichier Batch avec ce contenu :
for /f "tokens=2,4,6" %%a in ('type test.txt') do echo %%a %%b %%c > test.txt
Mettre une ligne sur une colonne. Inspirez-vous de ce modèle de script :
@echo off
for /f "tokens=1,2,*" %%a in ('type test.txt') do (
echo %%a
echo %%b
echo %%c
) >> sortie.txt
@echo on
Dans ce cas, le principe consiste à récupérer chaque bloc de donnés, puis de se servir de la commande "Echo" pour créer un
autre fichier nommé Sortie.txt. L'utilisation des parenthèses permet d'entasser les lignes dans un même fichier.
- Lire le contenu d'un fichier texte :
Il y a plusieurs méthodes possibles. Dans un nouveau fichier Batch, copiez ceci :
@echo off
for /f "delims=" %%a in (test.txt) do echo %%a
for /f "delims=" %%a in ('type test.txt') do echo %%a
for /f "delims=" %%a in ('more ^< test.txt') do echo %%a
@echo on
63
Comme nous le voyons, le contenu est identique, mais certaines commandes s'avèrent plus efficaces dans le cas de scripts
complexes.
- Supprimer toutes les lignes vides d'un fichier :
Vous pouvez vous inspirer de ce type de fichier Batch :
@echo off
for /f "delims=" %%a in ('type fichier.txt') do echo.%%a>>fichier1.txt
@echo on
Une nouvelle version du fichier sera créée...
- Afficher la première ou la dernière ligne d'un fichier :
Dans un nouveau fichier Batch, copiez ceci :
@echo off
set "ligne1="
for /f "delims=" %%a in ('type fichier.txt') do (
if not defined ligne1 set ligne1=%%a
)
echo %ligne1%
@echo on
Nous définissons une variable nommée" %ligne1% que nous ne définissons pas. Pour chaque ligne rencontrée par la
commande "For" nous définissons la variable %ligne1% sur la première ligne puis reprenons la commande pour la seconde
ligne présente dans le fichier. Mais puisque notre variable est déjà définie, nous ne lui attribuerons plus d'autre valeur. Et
donc nous afficherons que le contenu de la première ligne. En sens inverse, vous pouvez utiliser ce type d'astuce :
@echo off
for /f "delims=" %%a in ('type fichier.txt') do set "dernière=%%a"
echo %dernière%
@echo on
Là, c'est beaucoup plus simple ! Nous nous contentons d'afficher la dernière valeur trouvée pour la variable %dernière% et
c'est forcément la dernière ligne parcourue par la commande "For".
- Afficher un certain nombre de lignes :
Dans un nouveau fichier Batch, copiez ceci :
@echo off
set "lignes=%1"
set B=-1
set "C="
for /f "delims=" %%a in ('type fichier.txt') do (
set/a B+=1 & for /f %%z in ('echo %%B%%') do (
if "%%z"=="%lignes%" set C=1
)
if not defined C echo %%a
)
@echo on
Il suffit de saisir le nom du script suivi du nombre de premières lignes que nous souhaitons afficher. Nous posons trois
variables : %lignes%, %B% et %C%. Cette dernière n'étant pas définie. La variable %lignes% correspond au nombre de
lignes saisies par l'utilisateur à la suite du nom du Batch. La variable %B% reçoit une valeur négative au cas où l'utilisateur
ne veuille afficher qu'une ligne. Un balayage du fichier est effectué par la commande "For" et nous passons à l'opération suivante : Nous incrémentons la variable %B% d'un pas de un et nous affichons la valeur obtenue. Un second balayage est
alors effectué : Si la variable obtenue correspond au nombre de lignes spécifié par l'utilisateur alors nous définissons la
variable %C% sur 1. À l'inverse, si la variable %C% n'est pas définie alors nous affichons la ligne en cours. En d'autres
termes, si %z n'est pas encore égale à %lignes% alors nous affichons la ligne en cours. Quand la variable %z sera égale à
%lignes% alors nous n'afficherons pas la ligne en cours. Étant donné que nous ne visualiserons que les lignes affichées par
la commande "Echo" nous garderons l'impression que seules ces lignes ont été parcourues. En sens inverse, voici une
suggestion :
@echo off
set "lignes=%1"
for /f %%a in ('find /c /v "" ^< fichier.txt') do set/a Suppression=%%a-lignes
for /f "delims=" %%a in ('more /e +%Suppression% ^< fichier.txt') do echo %%a
@echo on
64
Dans ce cas nous affichons les deux dernières lignes. Dans un premier temps nous définissons une variable nommée
%suppression%. La commande Find /c /v "" nous permet d'obtenir le nombre de lignes qui ne sont pas vides. La valeur de
%suppression% s'obtient à faisant la soustraction du nombre de lignes par le nombre de lignes à afficher. La commande
"More" nous permet de n'afficher que la première ligne à partir de la valeur de %suppression%. Si, par exemple, notre
fichier compte 11 lignes et que nous souhaitez afficher que les deux dernières lignes, le calcul opéré par le Batch est le
suivant : 11 - 2 = 9. Nous afficherons donc le contenu du fichier à partir de la neuvième ligne et donc deux lignes seront
"relayées" par la commande "Echo".
- Afficher une ligne précise :
Dans un nouveau fichier Batch copiez ce contenu :
@echo off
set Numéro=%1
set "ligne="
set/a Numéro-=1
for /f "delims=" %%a in ('more/e +%%Numéro%% ^< fichier.txt') do (
if not defined ligne set "ligne=%%a"
)
echo %ligne%
@echo on
Saisissez le nom du script suivi du numéro de ligne à afficher. Là aussi, saisissez cette commande : echo /e +2 fichier.txt.
Nous afficherons le contenu de Fichier.txt à partir de la seconde ligne. Nous effectuons un balayage à l'aide de la commande
"For". À chaque fois nous essayons de définir la variable %ligne% sur la ligne en cours. Mais comme la variable %ligne% est
définie dès la première ligne trouvée nous n'affichons que cette première ligne. Et comme la première ligne trouvée
correspond bien à celle à partir de laquelle nous exécutons la commande, c'est la ligne correcte qui sera relayée par la
commande "Echo".
- Paramétrer les sorties :
Comparez la mise en page produite par ces trois fichiers Batch :
echo BLABLA >sortie1.txt
echo BLABLA >>sortie1.txt
echo.|set /p=BLABLA >sortie2.txt
echo.BLABLA >>sortie2.txt
echo BLABLA ^BLABLA >sortie3.txt
Le signe ^ provoque un retour chariot.
- Renvoyez le code d'erreur d'un fichier Batch :
Dans un nouveau fichier Batch copiez ce contenu :
@echo off
dir *.doc
for %%a in (5 4 3 2 1 0) do if errorlevel==%%a (
set code=%%a
goto erreur
)
:erreur
echo Le code renvoyé par la commande est %code%
@echo on
- Retrouver la version d'Internet Explorer :
Nous avons adapté un script proposé par Jerold Schulman à partir de son site Web : www.jsiinc.com. Dans un nouveau
fichier Batch copiez ce contenu :
@echo off
set valeur=reg query "HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer" /v Version
set version=findstr /I /L /C:"REG_SZ"
for /f "tokens=1,2,3" %%a in ('%valeur%^|%version%') do @echo La version d'IE est : %%c
@echo on
Cette information est consignée dans le Registre Windows. Nous interrogeons donc le Registre en parcourant cette
arborescence : HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer. Nous définissons une variable nommée
%valeur% qui sera la sortie-écran de la commande "Reg query". Nous posons ensuite une variable nommée %version% qui
sera la commande "Findstr" paramétrée pour rechercher la chaîne de caractères "REG_SZ". Enfin, nous effectuons un
65
balayage dans la sortie-écran affichée par la commande "Findstr" (remplacée par la variable %valeur%) et nous ne relayons
que le troisième bloc de données trouvé.
- Un script pour redémarrer votre ordinateur :
Dans un nouveau fichier Batch, copiez ce contenu :
@echo off
set /p question=Redémarrez votre ordinateur [O/N]?
if /i not "%question%"=="O"
@shutdown -r
@echo on
Ce sera l'utilisateur qui définira la valeur de la variable %question%. Si cette dernière est égale à o alors nous lançons la
commande "Shutdown". Sinon, nous terminons le script en utilisant la commande "Goto :eof".
- Calculer le temps passé sur une application :
C'est une solution simple qui est proposée ici, mais il est très facile d'améliorer ce script... Dans un nouveau fichier Batch
copiez ce contenu :
@echo off
echo Lancement de Notepad >> journal.txt
for /f "toke