-
BATCH > lire un fichier texte, et manipuler son contenu
INSÉRER DANS UN FICHIER
Exporter ou écrire du texte dans un fichier
(ECHO coucou le chiffre 2)>fichier.txt
ou
(
@echo Blablabla @echo Un texte un peu long ... @echo/ @echo ... et qui saute des lignes @echo/ ) >"%Temp%\Java.reg"
LISTER DES FICHIERS
Changer la date de modification d’un fichier sans le modifier
copy /b /y "fichier.txt" +
Cela revient à ajouter au fichier que nous copions un fichier inexistant. Aucune modification n’est alors apportée au fichier original. En l’absence du signe+il serait indiqué qu’il n’est pas possible de copier un fichier sur lui-même.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%
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 commandefind /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 :
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és
for %%a in (1 2 3 4 5 6 7 8 9) do echo Ligne %%a>>test.txtCompter les lignes d’un fichier et en afficher un nombre déterminé
Dans un nouveau document Batch copiez les lignes suivantes :
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%
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 égale 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%Acomme é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 commandemoreaffiche 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 fichier
set VAR=toto findstr "%VAR%" fichier if %errorlevel%==0 ...
exemple (on vérifie la présence d’un adresse IP dans le fichier hosts) :
findstr "192.168.0.3" %systemroot%\system32\drivers\etc\hosts if %errorlevel%==0 goto OK echo 192.168.0.3 >> %systemroot%\system32\drivers\etc\hosts goto :eof :OK echo Le fichier Hosts est déjà à jour !
Supprimer ou remplacer une chaîne de caractères dans un texte
Dans un nouveau fichier Batch saisissez ceci :
for /f "delims=" %%a in ('type "%1"') do call :commande "%%a" goto :eof :commande set ligne=%1 set ligne=%ligne:"=% @echo %ligne% >>fichier2.txt
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".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 ) )
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é 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ées par la commande "Echo".Trouver une même occurrence dans plusieurs fichiers
Ce fichier Batch sait le faire :
for /f "delims=" %%a in (‘findstr /m Microapp.com c:\*.*’) do echo "%%a"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
Saisissez le nom du Batch suivi du nom du fichier à analyser.
Pour bien comprendre comment fonctionne ce script comparez ces deux commandes :
dir "fichier.txt" /tc /-c /a:-d-s-h
dir "fichier.txt" /tc /-c /a:-d-s-h |find /v "(s)"
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 produit 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.txtMettre une ligne sur une colonne
Inspirez-vous de ce modèle de script :
for /f "tokens=1,2,*" %%a in (‘type test.txt’) do (
echo %%a
echo %%b
echo %%c
) >> sortie.txtDans ce cas, le principe consiste à récupérer chaque bloc de données 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 %%aComme nous le voyons le contenu est identique mais certaines commandes s’avèrent plus efficace 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.txtUne 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%Nous définissons une variable nommé" %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%
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 )
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 saisie 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
Dans ce cas nous affichons les deux dernières lignes.
Dans un premier temps nous définissons une variable nommée%suppression%.
La commandefind /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 9è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%
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".for /?
In addition, substitution of FOR variable references has been enhanced. You can now use the following optional syntax:
%~Iexpands%Iremoving any surrounding quotes (")%~fIexpands%Ito a fully qualified path name%~dIexpands%Ito a drive letter only%~pIexpands%Ito a path only%~nIexpands %I to a file name only%~xIexpands %I to a file extension only%~sIexpanded path contains short names only%~aIexpands %I to file attributes of file%~tIexpands %I to date/time of file%~zIexpands %I to size of file%~$PATH:Isearches the directories listed in the PATH environment variable and expands %I to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty stringThe modifiers can be combined to get compound results:
%~dpIexpands %I to a drive letter and path only
%~nxIexpands %I to a file name and extension only
%~fsIexpands %I to a full path name with short names only
%~dp$PATH:Isearches the directories listed in the PATH
environment variable for %I and expands to the
drive letter and path of the first one found.
%~ftzaI - expands %I to a DIR like output line