OVH Cloud OVH Cloud

HS: Pb avec Batch

5 réponses
Avatar
Shewy du 80 !!
Bonjour à tous.

Je crois que je ne suis pas sur le bon forum, mais en fait j'ai du mal à
trouvé le bon.

Je suis en train de rédiger un prog en Batch, et je cherche une fonction qui
me retrounerai le nom du répertoire courant.

En fait la commande CD me retourne le chemin complet.
Moi je voudrai que le nom du dossier (ou sous dossierà courant)
là où le Bat est placé.

Comment faire ??

merci

5 réponses

Avatar
Jean-Claude BELLAMY
Dans le message ,
Shewy du 80 !! <not> s'est ainsi exprimé :

Bonjour à tous.

Je crois que je ne suis pas sur le bon forum, mais en fait j'ai du
mal à trouvé le bon.


news:microsoft.public.fr.scripting eût été préférable !

Je suis en train de rédiger un prog en Batch, et je cherche une
fonction qui me retrounerai le nom du répertoire courant.

En fait la commande CD me retourne le chemin complet.
Moi je voudrai que le nom du dossier (ou sous dossierà courant)
là où le Bat est placé.

Comment faire ??


Comme ceci :

Fichier "curd.bat"
------- couper ici -------
@echo off
set p1=%CD%
:boucle
for /F "tokens=1 delims=" %%F in ("%p1%") do set first=%%F
set p2=%p1%
set p1=!p1:%first%=!
if "%p1%" NEQ "%p2%" goto boucle
echo Le dossier courant est : %p1%
------- couper ici -------

Commentaires :
==========
Le principe de base est d'extraire les sous-chaines du chemin complet, avec
"" comme séparateur
Pour cela, j'utilise une boucle FOR avec "tokens" et "delims"
Comme j'applique la boucle à une variable d'environnement, cela explique les
guillemets qui l'entoure
.... in ("%p1%") ...

NB : Je ne récupère que la 1ère sous-chaine, ce qui
peut surprendre a priori vu que ce que l'on veut,
c'est la dernière!
Le pb, c'est qu'on ignore combien il y a de sous-chaines!
Si on connaissait ce nombre, p.ex. si les chemins était
tous avec 3 sous-chaines telles que :
set p1=D:Documents and SettingsBELLAMY
la manip serait immédiate :
for /F "tokens=3 delims=" %%F in ("%p1%") do echo on est dans %%F
ou encore (plus compliqué!) :
for /F "tokens=1,2,3 delims=" %%F in ("%p1%") do echo on est dans
%%H
(la variable %%F est étendue à %%G, %%H, ...)

Comme ce n'est pas possible, il faut ruser !
Je récupère donc la 1ère sous-chaine,je lui adjoint un "", et je remplace
le tout par RIEN dans la chaine initiale.
Cela s'obtient à l'aide de la syntaxe de substitution bien connue (!) de la
commande SET :
set ch2=%ch1:oldstr=newstr%

Donc on veut remplacer dans %p1% la chaine contenue dans %first% par rien
On pourrait alors être tenté d'écrire :
set p1=%p1:%first%=%

mais cela ne va pas fonctionner, en raison de l'imbrication de variable
(%first%) à l'intérieur d'une autre variable (%p1%)
En effet, l'interpréteur va traiter cette instruction ainsi :
%p1:% -> variable inconnue -> vide
first -> chaine "first"
%=% -> variable inconnue -> vide
donc on va se retrouver avec p1 contenant la chaine "first" !!

Il faut donc ruser une fois de plus !
A savoir utiliser le caractère "!" au lieu de "%" pour encadrer l'expression
set p1=!p1:%first%=!
NB: ce caractère "!" sert à "l'expansion retardée de variable" (delayed
expansion)

Et là, ça marche !

Donc après cette instruction, p1 se voit amputée de la 1ère sous-chaine (+
"")
On se rebranche alors sur la boucle FOR, et ainsi de suite.

Pour savoir quand on doit s'arrêter, on compare p1 AVANT et APRÈS la
substitution
Or si c'est la dernière sous-chaine, il n'y a pas de ""
Donc "%first%" n'existe pas (seul "%first%" existe), donc aucune
substitution n'est effectuée, donc p1 est inchangé
D'où le test :
if "%p1%" NEQ "%p2%" goto boucle
%p2% étant une copie de %P1% avant substitution
NB: les guillemets sont nécessaires en raison de la présence éventuelle
d'espaces dans le chemin.

En ajoutant temporairement un "echo p1=%p1%" juste avant la boucle FOR, on
peut d'ailleurs suivre la progression :

H:Program FilesBorlandDelphi6ProjectsSuperExec>curd
p1=H:Program FilesBorlandDelphi6ProjectsSuperExec
p1=Program FilesBorlandDelphi6ProjectsSuperExec
p1=BorlandDelphi6ProjectsSuperExec
p1Þlphi6ProjectsSuperExec
p1=ProjectsSuperExec
p1=SuperExec
Le dossier courant est : SuperExec

C'est-y-pas beau ???? ;+))

Exemples :

H:Program FilesBorlandDelphi6ProjectsSuperExec>curd
Le dossier courant est : SuperExec

D:Documents and SettingsBELLAMY>curd
Le dossier courant est : BELLAMY

M:Doc technique formatsDBX>curd
Le dossier courant est : DBX


Voila, voila .... ;+))


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
http://www.bellamyjc.org *


Avatar
Jean-Claude BELLAMY
Dans le message ,
Jean-Claude BELLAMY s'est ainsi exprimé :

Si vous utilisez "Quote-Fix" (excellent au demeurant) avec Outlook express,
cet andouille transforme les ":" en tête d'une ligne par le symbole de
cotation ">" !
Donc mon fichier batch (qui contient une étiquette ":Boucle") peut
apparaitre affiché de travers.
Je le reposte donc, en décalant volontairement à droite toutes les lignes :

Fichier "curd.bat"
------- couper ici -------
@echo off
set p1=%CD%
:boucle
for /F "tokens=1 delims=" %%F in ("%p1%") do set first=%%F
set p2=%p1%
set p1=!p1:%first%=!
if "%p1%" NEQ "%p2%" goto boucle
echo Le dossier courant est : %p1%
------- couper ici -------


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
http://www.bellamyjc.org *

Avatar
Shewy du 80 !!
Merci Bcp !!!
Vraiment tres cool .. Avec toutes les explications en plus.

Merci vraiment

Je vais essayer ça tout de suite.

(Apparement un pb, j'ai une boucle qui m'affiche des P1 partout et rien
d'autre)

"Jean-Claude BELLAMY" a écrit dans le
message de news:
Dans le message ,
Jean-Claude BELLAMY s'est ainsi exprimé :

Si vous utilisez "Quote-Fix" (excellent au demeurant) avec Outlook
express,

cet andouille transforme les ":" en tête d'une ligne par le symbole de
cotation ">" !
Donc mon fichier batch (qui contient une étiquette ":Boucle") peut
apparaitre affiché de travers.
Je le reposte donc, en décalant volontairement à droite toutes les lignes
:


Fichier "curd.bat"
------- couper ici -------
@echo off
set p1=%CD%
:boucle
for /F "tokens=1 delims=" %%F in ("%p1%") do set first=%%F
set p2=%p1%
set p1=!p1:%first%=!
if "%p1%" NEQ "%p2%" goto boucle
echo Le dossier courant est : %p1%
------- couper ici -------


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
http://www.bellamyjc.org *





Avatar
Jean-Claude BELLAMY
Dans le message %,
Shewy du 80 !! <not> s'est ainsi exprimé :

Merci Bcp !!!
Vraiment tres cool .. Avec toutes les explications en plus.

Merci vraiment

Je vais essayer ça tout de suite.

(Apparement un pb, j'ai une boucle qui m'affiche des P1 partout et
rien d'autre)


C'est peut-être parce que "l'expansion retardée" n'est pas activée par
défaut chez toi.

C'est obtenu en exécutant CMD (une fois suffit) avec le commutateur "/V:ON"
Depuis le menu démarrer/exécuter, ou une fenêtre de commandes, tu tapes la
comamnde :
cmd /v:on

On peut aussi le faire en ajoutant une entrée dans la clef :
HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor
Entrée "DelayedExpansion"
Type REG_DWORD
Valeur 0x00000001


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
http://www.bellamyjc.org *


Avatar
Shewy du 80 !!
Salut !

Voilà
je viens d'ajouter l'entrée à la base de registre et maintenant tout marche
pile poil..

Merci Bcp



"Jean-Claude BELLAMY" a écrit dans le
message de news:
Dans le message %,
Shewy du 80 !! <not> s'est ainsi exprimé :

Merci Bcp !!!
Vraiment tres cool .. Avec toutes les explications en plus.

Merci vraiment

Je vais essayer ça tout de suite.

(Apparement un pb, j'ai une boucle qui m'affiche des P1 partout et
rien d'autre)


C'est peut-être parce que "l'expansion retardée" n'est pas activée par
défaut chez toi.

C'est obtenu en exécutant CMD (une fois suffit) avec le commutateur
"/V:ON"

Depuis le menu démarrer/exécuter, ou une fenêtre de commandes, tu tapes la
comamnde :
cmd /v:on

On peut aussi le faire en ajoutant une entrée dans la clef :
HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor
Entrée "DelayedExpansion"
Type REG_DWORD
Valeur 0x00000001


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
http://www.bellamyjc.org *