Les Fichiers Batch by Grare Stéphane - HTML preview

PLEASE NOTE: This is an HTML preview only and some elements such as links or page numbers may be incorrect.
Download the book in PDF, ePub, Kindle for a complete version.

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

You may also like...