Robocopy sortie fichier texte, supprimer les tabulations?

Résolu/Fermé
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 - Modifié le 2 juin 2021 à 17:29
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 - 4 juin 2021 à 23:40
Bonjour,

J'utilise un batch Robocopy pour copier sous Windows 10 la liste des films d'un disque dur externe dans un fichier sur un PC.
Le disque externe comporte des sous-dossiers alphabétisés (level 2) et un sous-dossier level 3 à exclure, ainsi que divers dossiers et fichiers liés au matériel à la racine et à exclure avec des commutateurs /XD et /XF, je vous passe le détail.

Reste donc la syntaxe qui suit:

chcp 1252 >nul
del c:\Users\bru\Desktop\films\films.txt
robocopy K:\ c:\Users\bru\Desktop\films /l /s /njh /njs /ns /lev:2 >> c:\Users\bru\Desktop\films\films.txt


Et qui donne une sortie qui ressemble à ça:


K:\
  • Fichier SUPPL. films.txt

Nouveau rép. K:\0\
Nouveau fichier 10_minutes_a_vivre.avi
Nouveau fichier 36_quai_des_orfevres.avi
Nouveau rép. K:\A\
Nouveau fichier Affames.avi
Nouveau fichier Anna_Karenine.avi

-Robocopy "crée" le fichier films.txt dans la destination alors que supprimé avant exécution?
-Robocopy génère:
--1 ligne vierge au début du fichier
--les noms "Nouveau rép". et "Nouveau fichier"
--l'ouverture par Notepad++ fait ressortir la structure suivante passée sous silence la 2ème ligne K:\ dont on peut se passer:
tabulation-Nouveau rép.-tabulation-K:\(nom)
tabulation-2 espaces-Nouveau fichier-3 tabulations-(nom)

J'aimerai me débarrasser au moins de la tabulation à gauche, de "nouveau rép." et de "nouveau fichier", substituant à ce dernier le nom du film. Notepad++ fait le job via substitution des tabulations par des points puis rechercher-remplacer, mais a priori pas automatisable.

Il faut donc, quitte à remplacer les "expressions coupables" par rien ou un point, probablement appliquer à Robocopy une syntaxe For /f avec délimiteurs adéquats et/ou find, mais je ne trouve rien qui fonctionne.

Si quelqu'un a l'inspiration, merci.
A voir également:

5 réponses

barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
Modifié le 4 juin 2021 à 19:08
Bonjour,

Ce que tu veux faire est trop compliqué.

S'il s'agit de créer une liste, pourquoi ne pas utiliser simplement un FOR avec un ECHO ?

Si tu as des choses à filtrer, tu peux ensuite rajouter des FIND.

set "filtre=*.mpeg *.mpg *.avi *.mkv *.3gp *.aaf *.asf *.flv *.mp4 *.ogg *.ogm *.mov *.webm *.rm *.dpx *.mxf *.omfi *.vob *.wmv *.xvid *.divx *.3ivx *.bik *.bik2 *.bk2" 

for /r K:\ %%A in (%filtre%) do echo %%A >>C:\Users\bru\Desktop\films\films.txt



0
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 2 729
4 juin 2021 à 20:31
Certes, la syntaxe est simple (et un peu à modifier puisque en renommant les fichiers j'ai oublié une cédille et que j'ai des extensions en plus et en moins):


@echo off
chcp 1252 >nul
set "filtre=*.avi *.ts *.mkv *.mp4 *.mpg

for /r K:\ %%A in (%filtre%) do echo %%A >>C:\Users\bru\Desktop\films\temp.txt


ça sort sous la forme:
K:\EF\Full_metal_jacket.avi

et j'en ai rajouté une couche en passant par un fichier temp:

@echo off
chcp 1252 >nul
for /f "tokens=1,2,3 delims=\" %%a in ('type "C:\Users\bru\Desktop\films\temp.txt"') do (
echo %%c >> C:\Users\bru\Desktop\films\films.txt

)


parce que je n'ai pas été fichu de trouver comment imbriquer la 2ème dans la première, là on a:
Full_metal_jacket.avi

Mais si j'ai envisagé de détourner une autre commande, c'est parce que:
1) La poubelle pourtant vide ne l'est pas et pas une extension à exclure: K:\$RECYCLE.BIN\$IJKEPSS.mp4
2) Toute commande que j'ai utilisée pour l'instant hors robocopy me retourne les fichiers d'un dossier "LAP" pourtant comme les autres après ceux du dossier "UZ"
3) Et parce que j'ai besoin de critères d'exclusion: 1 des dossiers (Records) contient à sa racine des fichiers .ts qui seront copiés et autres extensions qui seront exclues mais plusieurs sous-dossiers (au nom de chaque film) et comprenant chacun plusieurs .ts eux à exclure avec pour particularité de toujours s'appeler 00n.ts où n est un seul chiffre variable, il faut dans ces conditions soit exclure 00*.ts, soit exclure tous les dossiers au sens de robocopy de niveau 3.

Mais bien sûr, et pendant que je suis à abuser, si tu trouves une syntaxe plus simple pour faire le job, je suis preneur.
Merci.
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
Modifié le 4 juin 2021 à 21:16
Si tu veux juste récupérer le nom du fichier vidéo sans son chemin il n'y a pas besoin d'utiliser une deuxième boucle FOR, il faut utiliser les variables de substitution comme ceci :

@echo off
chcp 1252 >nul
set "filtre=*.avi *.ts *.mkv *.mp4 *.mpg"
 
for /r K:\ %%A in (%filtre%) do echo %%~nxA >>C:\Users\bru\Desktop\films\films.txt


1) Je ne comprends pas le sens de ta phrase : faut-il exclure ou inclure les fichiers de la corbeille ?

2) Ma boucle solutionne le problème

3) Voilà comment exclure les fichiers 00*.ts :
@echo off
chcp 1252 >nul
set "filtre=*.avi *.ts *.mkv *.mp4 *.mpg"
 
for /r K:\ %%A in (%filtre%) do echo %%~nxA | findstr /v /r "^00[0-9].ts" >>C:\Users\bru\Desktop\films\films.txt
0
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 2 729
Modifié le 4 juin 2021 à 21:33
Nickel pour éviter la 2ème boucle, merci (il va falloir maintenant que je suis retraité que je prenne un peu de temps pour re-potasser la ligne de commandes...).

1) Pour la poubelle: à l'idéal elle devrait être vide et apparaît sous Windows comme telle, le problème ne devrait dons pas se poser; mais en attendant de la vider réellement manu militari, non, bien sûr, je ne veux pas les fichiers mp4 qui s'y trouvent, mais conserver ceux qui n'y sont pas.

2) Non, non, la boucle ne résout pas le problème alphabétique, fin (partielle) du fichier, les 2 premiers étaient dans le dossier UZ, les 3 suivants dans le dossier LAP (pour L apostrophe, la passerelle multimedia n'aime pas):

Un_long_dimanche_fiancailles1.ts
Un_long_dimanche_fiancailles2.ts
Lhorloger_de_Saint_Paul.avi
Larmee_du_crime.avi
Lete_meurtrier.ts

3) Le dossier K:\Records (à la racine comme K:\LAP ou K:\UZ) comporte à sa propre racine (partiel):
La_leçon_de_piano.ts, La_leçon_de_piano.info, La_leçon_de_piano.ts.ast, La_leçon_de_piano.ts.lck: le script ne garde que le 1er et c'est parfait.
Mais il y a aussi un dossier K:\Records\La_leçon_de_piano qui contient:
00n.dvr, 00n.ts, info3.dvr, ici n vaut de 1 à 3, pour un film plus long ça peut aller jusqu'à 7 (le disque est en FAT32 parce que l'enregistreur ne supporte pas autre chose et saucissonne le film en autant de morceaux de 1 Go).
Tout ce qui s'y trouve n'y est qu'en attendant que je recolle les morceaux hors pub dans un seul fichier hors \Records ou parce que ça n'est pas possible (par exemple échec sur les formats de sous-titres), mais je n'en ai jamais besoin puisque le titre se trouve de toute façon dans le fichier bidon .ts (1 Ko !!!) à la racine de \Records

La dernière syntaxe que tu m'as gentiment fournie (et que je suis aller déchiffrer sur ss64, je mourrai moins bête) place en outre les fameux fichiers de \Records en tête de gondole, partiel:

La_leçon_de_piano.ts (racine de \Records)
cheval_de_guerre.ts
000.ts (sous-dossiers de \Records, 1 par nom)
001.ts
002.ts
000.ts
000.ts
001.ts
002.ts
003.ts
$IJKEPSS.mp4 (Poubelle)
$ILZHB8S.mp4
36_quai_des_orfevres.avi
Apocalypse_now.avi
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
Modifié le 4 juin 2021 à 21:32
2) Comme tu peux le vérifier sur l'image, le film du dossier LAP est listé avant les films du dossier UN :
0
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 2 729
4 juin 2021 à 21:43
Je ne le conteste pas et c'est logique, mais pas chez moi; c'est un dossier que j'ai renommé il y a quelque temps (toujours en L) mais qui n'a rien de particulier par rapport aux autres (même date de création, mêmes attributs...).

Pendant que je suis là, je n'avais pas regardé de près, la syntaxe que tu m'as proposée n'alphabétise pas dans chaque dossier, par exemple dans le dossier K:\LE:

Le_secret_de_Brokeback_Mountain.avi
Le_vieux_fusil.ts
Le_grand_bleu.ts
Le_nom_de_la_rose.ts
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
4 juin 2021 à 21:44
Ok je m'en occupe ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 2 729
4 juin 2021 à 21:55
Je vais te donner des cheveux blancs...
La poubelle, c'est réglé, je l'ai tuée sous Dos, un souci de moins.
L'arborescence DIR K: donne bien \Records en tête de gondole et \LAP à la fin, voilà pourquoi votre fille est muette (et problème qui n'apparaît pas avec robocopy).
La passerelle est casse-dépendante, mais pas Dos (Records au lieu de RECORDS, et de toute façon c'est R...).
Je cherche en même temps ce que je trouve pour ces dossiers, quant au sous-dossier de \Records, à part l'exclusion totale du dossier ou tous les fichiers 00*.ts?
Merci
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
4 juin 2021 à 22:33
Est-ce que c'est mieux comme ça :
@echo off
chcp 1252 >nul
set "filtre=*.avi *.ts *.mkv *.mp4 *.mpg"

cd /d K:

for /f "delims=" %%A in ('dir /b /s /on %filtre% ^| sort') do (

 if not "%%~pA"=="\$RECYCLE.BIN\" (echo %%~nxA | findstr /v /r "^00[0-9]\." >>C:\Users\bru\Desktop\films\films.txt)

)

pause
exit
0
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 2 729 > barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024
4 juin 2021 à 22:42
Immense progrès, un peu long à vérifier.
A priori, la machine fait ce qu'on lui dit et met les fichiers de \Records à R:

Rommel.avi
cheval_de_guerre.ts
Il_etait_une_fois_dans_louest.ts
La_leçon_de_piano.ts
Serie_noire.ts

Il est impossible de les ré-alphabétiser, dans un de mes essais de redirection en 2 temps, j'avais conservé les backslashs pour Records (en faisant l'écho à la troisième tabulation délimitée pour tous les autres et à la deuxième pour \Records).

A \T, je n'ai que les fichiers The_tartempion, et pas Titanic, Top_Gun (mais j'ai Te...).
Et je n'ai pas \UZ
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918 > brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024
Modifié le 4 juin 2021 à 22:56
Je n'ai pas dit mon dernier mot, je vais les alphabétiser de gré ou de force ;)

@echo off
chcp 1252 >nul
set "filtre=*.avi *.ts *.mkv *.mp4 *.mpg"

cd /d K:

(for /f "delims=" %%A in ('dir /b /s /on %filtre% ^| sort') do (

 if not "%%~pA"=="\$RECYCLE.BIN\" (echo %%~nxA | findstr /v /r "^00[0-9]\.")

)) >"C:\Users\bru\Desktop\films\temp.txt"

type "C:\Users\bru\Desktop\films\temp.txt" | sort >"C:\Users\bru\Desktop\films\films.txt"

pause
exit
0
brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024 2 729 > barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024
4 juin 2021 à 23:12
Absolument parfait sinon que tu as oublié de supprimer le fichier temp (je rajouterai la ligne pour l'itération suivante du script).
Merci infiniment.
Mais plutôt que de recopier bêtement une recette de cuisine, même sophistiquée, si tu as à l'occasion un moment pour la traduction: je ne suis pas sûr de ton pipe "sort" et, suite à l'histoire de poubelle (qui ne sert plus au moins jusqu'à la prochaine grève des éboueurs), je suppose que la sentence findstr sert à virer les fichiers ts parasites de \Records?
Encore une fois merci.
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918 > brucine Messages postés 18384 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 décembre 2024
Modifié le 4 juin 2021 à 23:25
Oui le FINDSTR sert à exclure les fichiers qui correspondent à cette REGEX : 00n.

Le TYPE affiche la liste de vidéos et le pipe SORT permet de le classer par ordre alphabétique.
Le premier SORT (au niveau de la boucle) peut être supprimé.

Vu qu'il n'y a plus besoin de gérer la poubelle, mon IF devient inutile mais il n'empêche pas le bon fonctionnement du script.

Tu m'excuseras pour le fichier temp, ce n'est pas un oubli c'est juste un peu de fainéantise, je me suis dit que tu pourrais te charger de cette tâche ingrate ;)

Est-ce que tu n'as pas de problème dans ta liste finale concernant les caractères accentués ou bien les cédilles ?
0