• BATCH > Les fichiers et dossiers

      COPIER

      fichiers

      copy "PROVENANCE" "DESTINATION"

      > copy "C:\test.txt" "C:\Test\test.txt"

      dossiers

      xcopy "PROVENANCE" "DESTINATION"

      > xcopy "C:\Test" "C:\Test\Test Copy"

      /S à la fin pour une copie récursive

       

      xcopy source destination

       

      /s/e copie récursive (même les dossiers vides)

      /v vérifie la copie par rapport à l’original. Plus lent mais plus paranoïaque

      /h copie les fichiers systèmes et les fichiers cachés

      /y écrase les fichiers déjà existants sans rien demander

      Copier à travers le net

      Copier à travers le net (et être sûr du transfert) : xcopy /s/z c:\source d:\dest

      Copier un disque ou une clef USB

      XCOPY "E:\" "C:\Chemin\de\la\copie" /S

       

      Si le périphérique est le lecteur E

      Copier les fichiers en les renommant par incrémentation

      Créer un fichier BAT :

       

      set compteur=0
      set rep1= c:\source
      set rep2= c:\destination
      for /f "tokens=1-2 delims=." %%a in ('dir /b %Rep1%') do (
      call Copie "%%a" "%%b"
      )

       

      Créer un autre fichier BAT (copie.bat) :

       

      set nom=%~1
      set extension=%~2
      set /a compteur+=1
      set fichier=%nom%%compteur%.%extension%
      copy %rep1%\"%nom%.%extension%" %rep2%\"%fichier%"

       

      Le script va renommer automatiquement chaque fichier copié en leur attribuant un numéro de traitement.
      Nous définissons une variable et deux répertoires.
      La troisième ligne permet de supprimer le . entre le nom du fichier et son extension (delims=.) et de décomposer le résultat en deux blocs distincts (tokens=1-2).
      Pour chaque objet trouvé dans le répertoire "source" nous appelons l’autre fichier Batch.
      Au nom et à l’extension. du fichier sont attribuées respectivement deux variables nommées %nom% et %extension%.
      La variable %compteur% est incrémenté d’un pas de 1.
      Une variable nommée %fichier% est créée en ajoutant à la suite de la variable %nom% la valeur de %compteur%.
      Nous copions le fichier correctement renommé dans le répertoire de destination.
      Les guillemets permettent de copier également les noms de fichiers comportant des espaces.

       

      Autre méthode :

       

      set compteur=1
      for /f %%a in ('dir c:\scripts\*.txt /b /s /-c /a:-d-s-h') do (
      call :menu %%a)
      set compteur=
      goto :eof
      :menu
      set fichier=%~d1& set chemin=%~p1& set nom=%~n1& set extension=%~x1
      ren %fichier%%chemin%%nom%%extension% %nom%.%compteur%%extension%
      set /a compteur+=1
      goto :eof

       

      Nous initialisons la variable %compteur% sur 1. Nous effectuons un balayage de la sortie de la commande "Dir" en appelant pour chaque ligne trouvée les commandes placées sous l’étiquette :menu. Chaque fichier sera décomposé entre son nom et son extension. Puis il sera renommé en accolant la valeur de la variable %compteur%. Cette dernière sera à chaque fois incrémentée d’un pas de un.

      RENOMMER DES FICHIERS

      ren chemin/vers/ancien_nom nouveau_nom

       

      exemple :

       

      ren C:\Users\&username%\Desktop\aaa.txt bbb.txt

      Nommer de manière incrémentielle

      Dans un nouveau fichier Batch copiez ce contenu :

       

      @echo off
      set nombre=
      :Boucle
      if not exist Document%nombre%.txt goto Copie
      set /a nombre+=1
      goto Boucle
      :Copie
      copy Document.txt Document%nombre%.txt

       

      Ce Batch renomme automatiquement un fichier nommé Document.txt en le numérotant à chaque fois.
      Nous créons une structure de boucle avec un "compteur" qui n’est pas encore initialisé. Nous assignons au compteur un nom de variable nommée %nombre%.
      Le script démarre ensuite les commandes contenues dans l’étiquette :Boucle.
      Si un fichier portant ce nom existe déjà nous incrémentons la variable %nombre% de 1 et nous retournons au début de notre boucle. Sinon nous exécutons les commandes spécifiées sous l’étiquette :Copie : le fichier précédent est copié puis renommé en ajoutant à son nom la variable %nombre%.

      SUPPRIMER

      supprimer des fichiers

      DEL "C:\Test\Test.txt"

      Supprimer tous les fichiers dans tous les répertoires spécifiés

      Dans cet exemple nous allons supprimer tous les fichiers contenus dans tous les répertoires nommés Temp.

      for /f "delims=" %%a in (‘dir c:\ /b /ad /s ^| findstr /i \%1′) do echo del "%%a\*.*"

       

      Saisissez le nom du fichier Batch suivi du nom du répertoire à "vider".
      La commande findstr /i \Temp nous permet de retrouver toutes les arborescences contenant la chaîne de caractères "Temp" et qui seront affichées par "dir".
      Vous devez préfixer le symbole de redirection | du signe ^ puisque qu’il fait partie des caractères réservés.
      Enfin, nous allons supprimer tous les fichiers présents dans chacune des arborescences trouvées.

       

      Une manière de supprimer des fichiers différents
      Créer un fichier BAT (test.bat) :

       

      :Boucle
      del *.%1
      shift
      if not "%1" == "" goto Boucle

       

      Il vous suffire alors de saisir ce type de commande : test txt doc exe
      le script démarre en supprimant les fichiers portant l’extension du premier paramètre saisi par l’utilisateur à la suite du nom du fichier Batch.
      shift permet de décaler la variable %1 ce qui permet de traiter le second paramètre (doc).
      Si une nouvelle variable est trouvée (si %1 n’est pas égale à "") alors nous reprenons le script à partir de l’étiquette :Boucle.

      supprimer des dossiers

      rmdir /S /Q c:\chemin\du\dossier
      /S supprime tous les sous-répertoires et fichiers également.
      /Q Pas de confirmation avant la suppression si l’option /S est utilisée.

      DÉPLACER DES FICHIERS

      @echo off
      set /p new_name=set a new name
      move /Y C:\sam\books.csv C:\samy\%new_name%.csv

       

      ou

       

      @echo off
      move /Y C:\sam\books.csv C:\samy\%%~1.csv

       

      The first will ask the user for the new name.The second relies on command line argument e.g. movescript.bat new_name

      After the second request in the comments bellow it appears that the ren command should be used after all:

       

      @echo off
      set /p new_name=set a new name
      move /Y C:\sam\books*.csv C:\samy\
      cd /D C:\samy\
      ren book_????_??_??.csv %new_name%_????_??_??.csv

       

      or

       

      @echo off
      move /Y C:\sam\books*.csv C:\samy\
      cd /D C:\samy\
      ren book_????_??_??.csv %%~1_????_??_??.csv

      déplacer des fichiers différents

      Dans un nouveau fichier Batch (nommé Test) copiez ce contenu :
      for %%a in (%1 %2 %3 %4 %5 %6 %7 %8 %9) do move "%%a" c:\destination
      Il vous suffire alors de saisir ce type de commande : test *.txt *.doc *.exe
      nous n’opérons pas de décalage de variable en nous servant de la commande "Shift".
      Cela revient à saisir directement cette commande :
      for %a in (*.txt *.doc *.exe) do move "%a" c:\destination
      Il est préférable de placer entre guillemets la  variable %a si les noms des fichiers traités comportent des espaces.

       

      Ajouter ou remplacer un ou plusieurs fichiers

      Dans un nouveau fichier Batch (nommé test) copiez ce contenu :

      replace %1\*.* %2 /a
      replace %1\*.* %2 /u

      Saisissez, par exemple, cette commande : batch c:\source c:\destination


      Opérez des modifications dans les fichiers placés dans le répertoire source puis à nouveau lancez la même commande en appuyant sur la touche F3.

      Il vous est possible de synchroniser les deux répertoires en remplaçant le contenu du fichier Batch par ceci :

      replace %1\*.* %2 /a
      replace %1\*.* %2 /u
      replace %2\*.* %1 /a
      replace %2\*.* %1 /u

      RENOMMER DES FICHIERS

      Insérer une date dans un nom de fichier

      echo sauvegarde_%date:~0,2%%date:~3,2%%date:~6,4%.txt

      LISTER DES FICHIERS

      Lister les fichiers correspondant à une date de modification

      Dans un nouveau fichier Batch copiez ce contenu :

      @echo off
      set dossier=%1
      set année=%2
      set dossier1=dir /b /s %dossier%
      set année1=findstr /l /c:"%année%"
      for /f "tokens=*" %%c in ('%dossier1%') do (
      set fichier=%%c
      call :commande
      )
      goto :eof
      :commande
      for /f %%c in ('dir "%fichier%" ^|%année1%') do @echo %fichier%

       

      La syntaxe permettant de lancer ce Batch est celle-ci : Nom_Batch Répertoire Année. Par exemple : test c:\source 2004
      Nous définissons quatre variables :
      %1 : le premier paramètre saisi par l’utilisateur qui sera le nom du répertoire.
      %2 : le second paramètre saisi par l’utilisateur qui sera l’année de modification.
      %dossier1% : le résultat de la commande "Dir" qui trie les fichiers en fonction de leur date de modification.
      %année1% : le résultat d’une recherche portant sur l’expression "2004″ si l’année spécifiée est 2004.
      Pour chaque ligne trouvée dans la sortie de la commande "Dir" il est alors demandé de :
      Définir une variable nommée %c
      D’appeler les instructions spécifiées sous l’étiquette :commande.
      Chaque ligne contenant l’expression définie par la variable %année% sera affichée en utilisant la commande "Echo".

      Lister tous les fichiers modifiés aujourd’hui

      Saisissez cette commande :
      dir *.* /o:n | find "%date%" | more

      Créer un dossier portant le nom de la date d’aujourd’hui

      Dans un nouveau fichier Batch copiez ce contenu :

      @echo off
      for /f "tokens=1-3 delims=/" %%a in ('date /t') do set dossier=c:\sauvegarde\%%a%%b%%c
      md %dossier%
      copy c:\test\*.txt %dossier%

      Nous nous proposons dans cet exemple de copier tous les fichiers Texte placés dans C:\Test dans un répertoire que nous allons créer et qui portera le nom de la date d’aujourd’hui. Le principe est assez simple :
      Nous nous servons de la commande "For" pour extraire trois variables "tokens=1-3″ de la commande "date /t".
      Une fois ces trois variables extraites nous créons une variable nommé %dossier% et qui correspond à un répertoire virtuel placé dans C:\Sauvegarde
      Le nom de ce répertoire est la date du jour. Afin d’éviter un message d’erreur nous nous servons du paramètre "delims=/" afin de soustraire du nom les barres transversales.
      Nous créons (Md) un répertoire portant le nom de la variable créée (%Dossier%).
      Pour mieux comprendre le mécanisme de ce script saisissez ces commandes :
      for /f "tokens=1-3 delims=/" %a in (‘date /t’) do set Dossier=c:\Sauvegarde\%a%b%c
      À la suite du prompt sera affiché la date du jour…
      md %dossier%
      Vous pouvez tester ce script an accédant aux propriétés de "Date et heure" et en changeant momentanément la date du jour. Le même script peut être utilisé pour réaliser des sauvegardes des fichiers en les rangeant pas heure. Il suffit de modifier la première ligne en inscrivant :
      for /f "tokens=1-2 delims=:" %%a in (‘time /t’) do set Dossier=C:\Sauvegarde\%%a%%b
      md %dossier%

      Copier des fichiers en fonction de la date d’aujourd’hui

      Servez vous de ce modèle de script :

      for /f "tokens=1-3 delims=/ " %%a in (‘date/t’) do set MMDDYY=%%b-%%a-%%c
      xcopy c:\source\*.* c:\destination /D:%MMDDYY%

       

      Il y a un piège : la commande "Xcopy" exige avec le commutateur /d que le mois soit spécifié avant l’indication du jour.
      Pour le reste, nous extrayons de la commande "Date /t" trois variables (mois, jour, année) qui nous servira à spécifier à partir de quelle date de dernière modification les fichiers seront inclus dans le processus de copie.

      Copier différentes sauvegardes d’un même fichier en les datant

      Dans un nouveau fichier Batch copiez ce contenu :

      setlocal
      for /f %%a in ('dir /b/x c:\source') do call :début %%a
      endlocal
      goto:eof
      :début
      set Nom1=%1
      for /f "tokens=1,2,3 delims= /" %%a in ('date /t') do set Date1=%%a%%b%%c
      for /f "tokens=1,2 delims=: " %%d in ('time/t') do set Heure1=%%d%%e
      for %%f in (%Nom1%) do (
      set Nom2=%%~nf
      set Extension=%%~xf
      )
      set Nom3=%Nom2%-%Date1%-%Heure1%%Extension%
      copy c:\source\%Nom1% c:\destination\%Nom3%

       

      Dans ce cas, le principe est de créer des sauvegardes des fichiers placés dans le répertoire Source dont les différentes versions seront datées puis classées dans un répertoire nommé Destination. Signalons tout de suite que ce script ne fonctionne pas si le fichier contient des espaces ou des caractères réservés.
      Les lignes 1 et 3 nous permettent de réinitialiser à chaque exécution du script les variables %nom1%, %nom2% et %extension%.
      Une fois cette précaution prise, la commande goto:eof nous permet de sortir du fichier de script.
      Le script proprement démarre en ligne n°2. Pour chaque ligne affichée par la commande "Dir" nous allons exécutez les commandes placées sous l’étiquette :début.
      Une variable nommée %Nom1% nous permet de récupérer le nom du fichier affiché par "Dir".
      Nous décomposons le nom complet du fichier en son nom (%%~nf) puis son extension (%%~xf).
      Par ailleurs, nous procédons à l’extraction des commandes "Date /t" et "Time /t" des valeurs qu’elles contiennent.
      Enfin, nous créons une nouvelle variable nommée %Nom3% qui est la concaténation des variables obtenues précédemment.
      Ne reste plus qu’à enclencher le processus de copie puis recommencer le même processus pour le nom de fichier suivant.

      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.

      gestion des répertoires

      un script qui cherche si un répertoire portant le nom indiqué existe bien sur un des lecteurs spécifiés.

      Dans un nouveau fichier Batch saisissez ce contenu :

      @echo off
      set liste=C,D,E et F
      for %%a in (%liste%) do for /f "delims=" %%b in ('dir /s /b /ad "%%a:\" 2^>NUL ^| findstr /i "\%~1$"') do (
      set dossier=%%b
      goto :Sortie
      )
      echo %1 introuvable dans %Liste%
      goto :eof
      :Sortie
      echo %dossier%

       

      Il suffit de saisir le nom du script suivi du nom du répertoire recherché.

      %liste% contient les noms des lecteurs.

      Suivent deux commandes for imbriquées l’une dans l’autre.

      Afin de mieux comprendre le fonctionnement de la seconde, saisissez ceci en Invite de commandes :
      dir /s /b /ad "c:\" 2>nul | findstr /i "\destination"
      Nous recherchons dans la sortie de la commande dir une occurrence qui sera \destination.
      En toute logique, si un répertoire nommé Destination est trouvé il sera repéré par la barre transversale qui le précède.
      2>nul évite l’affichage d’éventuels messages d’erreur.
      ^ est nécessaire pour préfixer les symboles de redirection > et | à partir du moment qu’ils sont utilisés dans un fichier de script.
      %\~1$ permet de récupérer le chemin absolu qui mène au répertoire
      La première ligne trouvée (%b) est passée en tant que variable et elle sera nommée %dossier%.
      Il ne reste plus qu’à se rendre à l’étiquette :Sortie et à afficher la variable obtenue.

      Supprimer un nombre déterminé de fichiers dans un répertoire donné

      Dans un nouveau fichier Batch nommé Test copiez ce contenu :

      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

       

      Pour supprimer les 5 premiers fichiers .txt dans un répertoire Source, saisir : 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

      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

       

      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é.
      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%

       

      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

      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 ?

      VÉRIFIER LA PRÉSENCE OU L’ABSENCE

      fichier existe

      if exist Fichier Commande

       

      Tester l’absence d’un fichier : if not exist Fichier Commande

       

      dossier existe

      if exist Dossier\nul

       

      ici \nul est obligatoire pour dire au DOS que l’on parle de dossier et non de fichier.

       

      Tester l’absence d’un dossier : if not existDossier\nulCommande

      LISTER UN DOSSIER

      FOR /D [/r] %%parameter IN (folder_set) DO command

       

      folder_set A set of one or more folders. Wildcards must be used.

      command The command to carry out, including any command-line parameters.

      %%parameter A replaceable parameter:in a batch file use %%G (on the command line %G)

      /r Recurse into subfolders (see notes below)

       

      In all cases for /d will start searching from the current directory.

       

      Unlike other variants of the FOR command you must include a wildcard (either * or ?) in the ‘folder_set’ to get consistent results returned. In many cases you can work around this by adding a single character wildcard e.g. if you are looping through multiple folders to find the exact folder January you could instead specify Janu?ry

       

      If any path in the the folder_set includes spaces, then surround the path with double quotes.

       

      The option /d /r is undocumented, but can be a useful combination, while it will recurse through all subfolders the wildcard will only match against Folder/Directory names (not filenames).

      Alternatives

       

      An alternative command to list folders and sub folders matching a wildcard is DIR:

      C:\> dir /b /s /a:d "C:\Work\reports*"

       

      To loop through each folder programatically, we can wrap that in a FOR /F command:

      C:\> for /f "tokens=*" %G in ('dir /b /s /a:d "C:\Work\reports*"') do echo Found %G

       

      or the same thing in a batch file, with the %’s doubled:

      for /f "tokens=*" %%G in ('dir /b /s /a:d "C:\Work\reports*"') do echo Found %%G

       

      List every subfolder, below the folder C:\Work\ that has a name starting with "User":

       

      @Echo Off
      CD \Work
      FOR /D /r %%G in ("User*") DO Echo We found %%~nxG

      ———

      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

      ———

      https://fr.wikibooks.org/wiki/DOS/Rmdir

 

Aucun commentaire

 

Laissez un commentaire