Recuperer un pattern en batch

Recuperer un pattern en batch - Shell/Batch - Programmation

Marsh Posté le 15-02-2006 à 11:15:01    

Bonjour,  
 
Alors voila, j'ai un batch ms dos à faire, et j'avoue que je galère pas mal...euh, oué en fait j'y connais pas grand chose en shell...
Bref, donc
 
En gros, ce qu'il me manque pour le moment, c de pouvoir récupérer le début d'un fichier dans une variable.
Par exemple, j'ai un fichier xxx-nimportequoi.txt, et j'aimerais récupérer la chaîne xxx dans une variable. Bien sur, la taille de xxx est variable, et je veux donc matcher sur le "-"
 
Est ce que qqun peut m'aider ?
 
Si qqun a une solution pour linux, je prends aussi, j'essaierai de transcrire...
 
Merci !!
Cheloute

Reply

Marsh Posté le 15-02-2006 à 11:15:01   

Reply

Marsh Posté le 15-02-2006 à 13:07:45    

Tu sais lire un fichier ligne par ligne ?
 
Pour décomposer une chaîne par un ou des délimiteurs, il y a :
for "tokens= delims="
 
for /?
pour plus d'infos.

Reply

Marsh Posté le 15-02-2006 à 14:06:08    

Euh, merci, mais pk lire un fichier ligne par ligne ? Moi c juste le nom du fichier qui me concerne, ce qu'il y a dedans, pour le moment ne me regarde pas...
Bon m'enfin je suppose que ton for tokens delim doit de toutes façons s'appliquer a une variable de type chaine, donc je vais de ce pas essayer de voir comment on s'utilise cette bébête ;)
A tout à l'heure si je m'en sors pas :)
 

Reply

Marsh Posté le 15-02-2006 à 14:14:37    

cheloute a écrit :

Euh, merci, mais pk lire un fichier ligne par ligne ? Moi c juste le nom du fichier qui me concerne, ce qu'il y a dedans, pour le moment ne me regarde pas...


 

cheloute a écrit :

En gros, ce qu'il me manque pour le moment, c de pouvoir récupérer le début d'un fichier dans une variable.


 
N'est-ce pas ? ;)
 
@+

Reply

Marsh Posté le 15-02-2006 à 14:26:56    

hé hé hé, un rien t'arrête :D
Je parlais du début du nom dudit fichier ;)

Reply

Marsh Posté le 15-02-2006 à 14:36:26    

Bon je viens donc de regarder la doc du FOR (/?), et je crois que donc ton for ne va pas trop trop marcher...
 
Si j'ai bien compris comment ça marche, il me faudrait un truc du genre  
FOR /F "token=1 delims=-" %i IN (ensemble) DO plein de choses
 
Sauf que mon %i ne peut pas etre un nom de fichier, vu que ce que je veux lire est le nom d'un fichier et non ce qu'il y a dedans, et ensemble doit être le répertoire de tous ces fichiers (surement un dir qqch ,non ?)
 
C'est possible de faire un truc de ce genre ou c pas du tout la bonne méthode ??

Reply

Marsh Posté le 15-02-2006 à 14:42:42    

C'est la bonne méthode mais tu n'as pas fourni les bons params.
 
Toujours dans for, regarde l'option usebackq pour définir correctement ensemble.

Reply

Marsh Posté le 15-02-2006 à 14:44:06    

cheloute a écrit :

hé hé hé, un rien t'arrête :D
Je parlais du début du nom dudit fichier ;)


Ben c'est de ta faute :D
 
Ton message laissait entendre qu'il s'agissait deux problèmes à la fois : lecture d'un fichier + extraction d'une chaîne.

Reply

Marsh Posté le 15-02-2006 à 15:01:04    

Bon j'arrive a un résultat plutôt pas mal en fait avec tes conseils, donc merci beaucoup...
 
Ce que j'ai fait est donc :
FOR /F "usebackq tokens=1 delims=-" %%i in (`dir /b`) do (
  set PATTERN=%%i
  call :process
)
:process
echo %PATTERN%
 
Donc, nouvelle question, est-il possible dans ce cas de ne pas afficher ce qu'il est en train de faire ???, cad qu'il n'affiche que chaque %PATTERN% qu'il crée et pas toutes les opérations qu'il effectue ?

Reply

Marsh Posté le 15-02-2006 à 15:01:31    

mdrrr pour les :p, c donc des ": p"

Reply

Marsh Posté le 15-02-2006 à 15:01:31   

Reply

Marsh Posté le 15-02-2006 à 15:03:40    

echo off
FOR /F "usebackq tokens=1 delims=-" %%i in (`dir /b`) do (
  set PATTERN=%%i
  call :process
)
 
:process
echo on
echo %PATTERN%
echo off
 
ça me vire bien les commandes, mais il ecrit echo off un peu partout, et affiche le prompt à chaque affichage de pattern :(

Reply

Marsh Posté le 15-02-2006 à 15:19:50    

Raaaa, chui trop laid, suffisait de mettre un @echo...

Reply

Marsh Posté le 15-02-2006 à 15:26:48    

;)
 
Sinon, une petite chose : quand on termine la boucle for, on "saute" la sous-procédure. Sinon, dans ce cas précis, ça affiche le dernier PATTERN deux fois.
 

Code :
  1. for blabla (
  2.   blabla
  3.   call :process
  4. )
  5. goto end
  6. :process
  7. blabla
  8. :end


 
Voilou ;)

Reply

Marsh Posté le 15-02-2006 à 15:37:25    

ah ouéééé
J'ai pas vérifié si j'avais le bon nombre ,tu fais bien de me le faire remarquer tiens...
 
Merciiii

Reply

Marsh Posté le 15-02-2006 à 15:49:16    

Bon, autre pb...J'ai maintenant à concaténer un nombre quelconque de fichiers présents dans le même répertoire...Un coup d'oeil à copy /? qui me dit que pour faire ça, on peut utiliser les caracteres génériques en source, et un fichier en destination.
Or, quand je fais copy %REP%-*.* %REP%.txt, il m'envoie bouler...Il me dit que la syntaxe de la commande est incorrecte :(
 %REP existe, et les fichiers %REP%-*.* aussi
Par contre %REP%.txt n'existe pas, il doit etre créé comme sur un shell unix ou pas ? C'est ça le pb ? ou y a autre chose ??

Reply

Marsh Posté le 15-02-2006 à 16:02:25    

pfff, je dis vraiment nimp des fois, rien à voir mon erreur...
 
Bon, en fait, ce que je veux faire au final, c'est :
j'ai un répertoire qui contient des fichiers nommés : pattern1-blabla.ext, pattern2-blabla.ext pattern1-blabla2.ext pattern3-blabla.ext.
 
Bon de là, je crée les repertoires ./pattern1, ./pattern2 et ./pattern3 et je déplace les fichiers tel que :
dans pattern1/ j'ai pattern1-blabla.ext et pattern1-blabla2.ext, dans ./pattern2 j'ai pattern2-blabla.ext et dans ./pattern3 j'ai pattern3-blabla.ext .
 
ensuite, je veux concaténer les fichiers de pattern1 dans le fichier ./pattern1/pattern1.txt, et idem pour pattern2 et pattern3
 
ce que j'ai fait c :
 
FOR /F "usebackq tokens=1 delims=-" %%i in (`dir /b`) do (
  set PATTERN=%%i
  if not exist %PATTERN%. (mkdir %PATTERN%)
  move %PATTERN%-*.* ./%PATTERN%/
)
 
FOR /F "usebackq" %%j in (`dir /b /a:d`) do (
  set REP=%%j
  cd %REP%
  copy %REP%-*.* %REP%.txt
del %REP%-*.*
cd ..
)
 
Et evidemment ça fait n'importe quoi :(
Si je mets pas le 2eme FOR, il me crée mes repertoires et me mets mes fichiers dedans (moyennant des pitites erreurs, mais je sais pk, vu que je déplace les fichiers du "dir" avant d'avoir fait tout le FOR)
mais quand j'ajoute le 2eme FOR, il me déplace les fichiers du pattern1, et c tout, ensuite, erreur : impossible de trouver "-*.*"

Reply

Marsh Posté le 15-02-2006 à 16:16:13    

Je sais : c'est la faute typique des débutants en batch  :D
 
Tant que tu ne sors pas de la boucle  
for  
PATTERN n'est toujours pas initialisé. Donc à l'exécution :  
if not exist %PATTERN%. (mkdir %PATTERN%)  
devient  
if not exist . (mkdir )  
et bien sûr que c'est n'importe quoi  ;)
 
Pour y rémédier, il faut :  
- soit utiliser l'expansion retardée des variables ;  
- soit faire set PATTERN= dans la boucle for puis appeler une sous-procédure qui fait des manips (if, mkdir, etc.)  
 
Idem pour la deuxième boucle (init de REP)  
 
 
PS : pour ce cas précis, je ne créerais pas PATTERN et REP mais appelerais directement les tokens. Exemple :  
 
if not exist %%i mkdir %%i

Reply

Marsh Posté le 15-02-2006 à 16:27:54    

aaaaaaaahhh, ça y est, ça marchouille presque...
Est ce qu'il y a moyen de cacher les message comme quoi il ne toruve pas les fichiers et patati patata, et est-ce qu'il est possible de concatener 2fichiers textes sans avoir de retour a la ligne entre les 2 ?
Enfin, est il possible de ne pas terminer les fichiers par un carré ? :D

Reply

Marsh Posté le 15-02-2006 à 16:38:13    

Pour cacher les messages d'erreur : on pipeline stderr vers nul :
blabla 2>nul
 
Pour supprimer le CRLF entre deux fichiers et le carré à la fin : essaie copy /b mais je ne sais plus trop :D

Reply

Marsh Posté le 15-02-2006 à 16:39:08    

ok merci !!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed