-
BATCH > Les fichiers et dossiers
supprime tous les sous-répertoires et fichiers également./S
Pas de confirmation avant la suppression si l’option /S est utilisée./Q
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écursivexcopy 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 demanderCopier à 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" /SSi 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 commandefindstr /i \Tempnous 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.
shiftpermet de décaler la variable%1ce qui permet de traiter le second paramètre (doc).
Si une nouvelle variable est trouvée (si%1n’est pas égale à"") alors nous reprenons le script à partir de l’étiquette:Boucle.supprimer des dossiers
rmdir /S /Q c:\chemin\du\dossier
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%asi 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 /uSaisissez, 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 /uRENOMMER DES FICHIERS
Insérer une date dans un nom de fichier
echo sauvegarde_%date:~0,2%%date:~3,2%%date:~6,4%.txtLISTER 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%" | moreCré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é dansC:\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
forimbriqué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 commandedirune 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:Sortieet à 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 commandedirnous 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%asera 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 commandedelsupprime tous les fichiers du nouveau répertoire par défaut.
Nous utilisons la commandedirafin de n’afficher que les répertoires. Pour chaque occurrence trouvée nous nous servons de la commanderd.
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 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.txtAfficher 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
\nulest obligatoire pour dire au DOS que l’on parle de dossier et non de fichier.Tester l’absence d’un dossier :
if not exist
Dossier\nul
Commande
LISTER UN DOSSIER
FOR /D [/r] %%parameter IN (folder_set) DO command
folder_setA set of one or more folders. Wildcards must be used.commandThe command to carry out, including any command-line parameters.%%parameterA replaceable parameter:in a batch file use %%G (on the command line %G)/rRecurse 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:
%~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———
https://fr.wikibooks.org/wiki/DOS/Rmdir