• 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 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 :
      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.txt

      Compter 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 %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 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.txt

      Mettre 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.txt

      Dans 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 %%a

       

      Comme 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.txt

      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%

       

      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 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 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:

      %~I expands %I removing any surrounding quotes (")

      %~fI expands %I to a fully qualified path name

      %~dI expands %I to a drive letter only

      %~pI expands %I to a path only

      %~nI expands %I to a file name only

      %~xI expands %I to a file extension only

      %~sI expanded path contains short names only

      %~aI expands %I to file attributes of file

      %~tI expands %I to date/time of file

      %~zI expands %I to size of file

      %~$PATH:I searches 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 string

       

      The modifiers can be combined to get compound results:
      %~dpI expands %I to a drive letter and path only
      %~nxI expands %I to a file name and extension only
      %~fsI expands %I to a full path name with short names only
      %~dp$PATH:I searches 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

 

Aucun commentaire

 

Laissez un commentaire