please ....help : probleme de set

please ....help : probleme de set - Shell/Batch - Programmation

Marsh Posté le 12-04-2006 à 09:11:16    

voila j'ai fais un pti batch (sous windaubeXP) qui doit me ressortir les noms des repertoires contenant un fichier "nom_fichier"
et me mettre ces repertoires dans un fichier texte créé a cette occasion .... jusque la tout allé bien, voila mon script :
 
:://on retire l'affichage successifs des repertoires parcourus
@ECHO OFF
FOR /R %%i IN (.) DO (
             IF EXIST %%i\"nom_fichier" (
                    IF EXIST "sortie.txt" (
                            ECHO %%i>>"sortie.txt"
                    ) ELSE (ECHO %%i>"sortie.txt"
                    )
             )
)
:://on affiche le contenu des sorties dans la fenetre MsDos
TYPE "sortie.txt"
 
maintenant mon souci, c'est que je ne veut conserver que les 10premiers des 12 derniers caractères
(car jme fiche d'avoir le chemin complet du dossier, jve juste le dernier repertoire du chemin et
ces repertoires ont toujours 10 caractères)
en utilisant set ca ma donné :
 
@ECHO OFF
FOR /R %%i IN (.) DO (
             IF EXIST %%i\"nom_fichier" (    
                    set pat=pat %%i
                    set pat=%pat:~-12%
                    set pat=%pat:~0,-2%
                    ::%%i=%pat%
                    echo %pat%
                    IF EXIST "sortie.txt" (
                            ECHO %%i>>"sortie.txt"
                    ) ELSE (
                            ECHO %%i>"sortie.txt"
                    )
                    set pat=
             )
)
TYPE "sortie.txt"
 
jvois pas comment faire autrement pour la gestion des noms de dossier...
mon script ne marche pas : je n'ai que le dernier repertoire trouvé dans mon fichier de sortie
(et je l'ai autant de fois qu'il trouve des dossier correspondant)
si vous avez une idée .... merci d'avance

Reply

Marsh Posté le 12-04-2006 à 09:11:16   

Reply

Marsh Posté le 12-04-2006 à 09:51:19    

correction de mon derniers script (l'avé un cthi pb :p )
mais bon il marche pas, si vous aviez une iD du pourkoi ...ou du comment ...
 
 
@ECHO OFF
FOR /R %%i IN (.) DO (
             IF EXIST %%i\"modelisation_2.par" (  
                    set pat=%%i
                    set pat=%pat:~-12%
                    set pat=%pat:~0,-2%
                    IF EXIST "sortie.txt" (
                            ECHO %pat%>>"sortie.txt"
                    ) ELSE (
                            ECHO %pat%>"sortie.txt"
                    )
                    set pat=
             )
)
TYPE "sortie.txt"

Reply

Marsh Posté le 12-04-2006 à 12:52:40    

Ca concerne l'expansion retardée des variables :
set /?
pour le paragraphe concerné.
 
Il faut donc soit utiliser la méthode mentionnée dans ledit paragraphe, soit utiliser une sous-procédure avec %%i comme paramètre.

Reply

Marsh Posté le 12-04-2006 à 13:12:24    

ba ouai, j'ai deja lu 3 fois le "set /?" et je ne posterai pas un message si je n'avais pas TOUT essayé pour resoudre mon probleme moi-meme...
 
mais honnetement j'ai pas compris la subtilité de l'expension des variable d'environment, donc si t'avais une aide (autre ke set /?)
 
sinon est-ce que tu pourrait m'en dire plus sur une sous procedure avec %%i en parametre 8-) car je blok vraiment la ...
 
merci

Reply

Marsh Posté le 12-04-2006 à 13:34:06    

Code :
  1. setlocal ENABLEDELAYEDEXPANSION
  2. for /l %%i in (1,1,5) do (
  3.   set /a j=%%i+1
  4.   echo !j!
  5. )


 

Code :
  1. for /l %%i in (1,1,5) do (
  2.   call :process %%i
  3. )
  4. goto end
  5. :process
  6. set /a j=%1+1
  7. echo %j%
  8. :end

Reply

Marsh Posté le 12-04-2006 à 13:40:14    

merci pour la rapidité de ta reponse :)
 
un dernier truk bidon (ouai c vraiment bidon ca)
 
1 - set /P test=
2 - if "%test%"=="*mot*" (echo yes) else (echo Hell Nooooo !!!)
3 - set test=
 
la ske jve c'est ke l'utilisateur me rentre une chaine et si dans cette chaine on trouve une occurence de 'mot' on repond yep, le probleme c'est k'il me repond yep uniquement si la chaine fourni est *mot* ...
(pourtant j'pensais que l'*' était le caractère spécial ki remplacait n'importe quelle chaine de caractère, meme la chaine vide ....
 
merci encore

Reply

Marsh Posté le 12-04-2006 à 13:43:01    

Tu peux refaire en un français correct ?
 
J'ai vraiment du mal avec le SMS. Désolée.

Reply

Marsh Posté le 12-04-2006 à 13:50:46    

:s désolé
 
je voudrai que ce shell me reponde "yep" a partir du moment ou dans la phrase qu'il tape il y a le mot "mot"
exemple : "je trouve pas de mot pour exprimer mon désaroi"
 
alors j'ai fais le pti script avec mot entre deux etoiles en pensant que l'etoile permettai comme sous linux de lui spécifier n'importe quel chaine de caractères, meme une chaine vide ...
 
pourtant avec ce script la possibilité davoir le prompt repondant "yep"
c'est de rentré la chaine *mot* dans tout les autres cas il me répond
non ...
 
(en gros la question c'est quel est le caractère qui spécifie n'importe quel chaine de caractères et comment l'utiliser correctement)

Reply

Marsh Posté le 12-04-2006 à 14:22:20    

bon, pour le caractère spécial * c'est pas grave j'vai trouver un moyen de gérer, par contre ... pour le batch que tu ma donné avec le localexpension
 
c'est trés bien tout ca , mais comme j'modifie ma variable 3fois de suite, ca ne resoud pas mon probleme :'(
 
                    set pat=%%i
                    set pat=%pat:~-12%
                    set pat=%pat:~0,-2%  
 
si seulement ces 3lignes pouvait fonctionner mon batch serai fini (j'met pas shell de peur de me faire traiter par les puristes :o )
 
en tout cas merci, j'ai mie compris l'expension maintenant et j'aurai jamais pensé a faire un  
                          echo !pat!
tout seul
 
CI-MER ;)

Reply

Marsh Posté le 12-04-2006 à 14:28:45    

oua .... j'ai bien suivi ton exemple et : NICKEL :d
jpe pas avoir plus le moral qu'a l'heure actuelle
meme si tu comprends pas le langage SMS, merci merci , un enorme merci
 
tu m'as debloké ca faisait 2 jours que j'étais dessus
 
si y a des personnes interréssé voil

Reply

Marsh Posté le 12-04-2006 à 14:28:45   

Reply

Marsh Posté le 12-04-2006 à 14:30:45    

voila le batch que ca fait au final :
(avec quelques commentaires ;) )
 
 
::suprime l'affichage successif de l'arborescence
@ECHO OFF
::debut de traitement
FOR /R %%i IN (.) DO (
             IF EXIST %%i\"nom_fichier" (  
             call :process %%i                    
             )
)
::affiche le contenu du fichier de sortie a l'ecran
TYPE "sortie.txt"
::on supprime le fichier
ERASE "sortie.txt"
goto end
 
 
:process
::active les extensions de commandes
setlocal ENABLEDELAYEDEXPANSION
set pat=%1
set _pat=%pat:~-12%
set fin_pat=%_pat:~0,-2%
::ecriture des resultats dans le fichier texte de sortie
IF EXIST "sortie.txt" (
      ECHO !fin_pat!>>"sortie.txt"
) ELSE (
      ECHO !fin_pat!>"sortie.txt"
)
 
:end
 
 
 
franchement, jle dirai jamais assez : MEEEEEErCIII :p

Reply

Marsh Posté le 12-04-2006 à 14:41:48    

juste comme ca par curiosité, le batch ci-dessus fonctionnera t'il avec une version de windauB autre que la version XP (genre pour un utilisateur sous win9x ou 2000) ???
si vous savez 8-)

Reply

Marsh Posté le 12-04-2006 à 15:06:26    

Je pense que ça va fonctionner avec 2000 mais pas avec 9x. DOS ne supporte pas certaines fonctionnalités avancées comme l'invite de commandes de Windows.
 
Juste une petite remarque pour tes deux commandes :
set pat=%pat:~-12%
set pat=%pat:~0,-2%
 
La première extrait les 12 derniers caractères de la chaîne.
La deuxième extrait les premiers caractères du résultat précédent sauf les deux derniers.
 
Tu peux alors les combiner en une seule commande :
set pat=%pat:~-12,-2%
 

Code :
  1. setlocal ENABLEDELAYEDEXPANSION
  2. for /l %%i in (1,1,5) do (
  3.   set j=abcdefghijkl%%imno
  4.   echo j=!j:~-12,-2!
  5. )


 
Sinon, si tu appelles une procédure, tu n'as pas besoin d'activer l'expansion retardée. Ton script sera alors (tu as les balises code pour la mise en page sur le forum) :
 

Code :
  1. ::suprime l'affichage successif de l'arborescence
  2. @ECHO OFF
  3. :debut de traitement
  4. FOR /R %%i IN (.) DO (
  5.   IF EXIST %%i\"nom_fichier" (
  6.     call :process %%i
  7.   )
  8. )
  9. ::affiche le contenu du fichier de sortie a l'ecran
  10. TYPE "sortie.txt"
  11. :on supprime le fichier
  12. ERASE "sortie.txt"
  13. goto end
  14. :process
  15. set pat=%1
  16. set pat=%pat:-12,-2%
  17. ::ecriture des resultats dans le fichier texte de sortie
  18. IF EXIST "sortie.txt" (
  19.   ECHO %pat%>>"sortie.txt"
  20. ) ELSE (
  21.   ECHO %pat%>"sortie.txt"
  22. )
  23. :end


 
Enfin, pour la comparaison des chaînes, les wildcards ne sont pas supportés.
 
Voilà ;)

Reply

Marsh Posté le 12-04-2006 à 15:32:08    

mon probleme est resolu :d
un grand merci a toi
 
big up nglechau, u rox ;)
 
(dommage pour les wildcards, ca va m'obliger a refaire un traitement, mais deja avec ca, j'suis blindé :p )

Reply

Sujets relatifs:

Leave a Replay

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