Je tente de me faire un résumé des possibilités existentes
concernant la manipulation des variables ...
car j'ai tendance à oublier ce que j'utilise peu...
J'ai beaucoup de difficulités à trouver l'aide "en ligne"...
Car l'info est parfois dispo dans des endroits innatendus...
J'arrive à ce qui suit mais il me semble qu'il en manque ...
J'attends donc vos précisions et commentaires ...
Merci d'avance,
HB
===============================================
1. Lorsqu'une variable Machin
contient le chemin complet d'un fichier
%~Machin Supprime les guillemets éventuels (")
qui encadraient le chemin.
%~fMachin Chemin complet + Nom
%~dMachin Lettre de lecteur
%~pMachin Chemin d'accès
(sans la lettre du lecteur ; finit par « \ » )
%~nMachin Nom de fichier
%~xMachin Extension du fichier (avec le point)
%~sMachin Chemin avec des noms courts
%~aMachin Attributs du fichier
%~tMachin Date/heure du fichier
%~zMachin Taille du fichier en octets
et on peut cumuler :
%~dpMachin chemin d'accès avec lecteur
%~nxMachin Nom de fichier et extension
%~fsMachin chemin complet avec noms courts
%~ftzaMachin comme un DIR ...
Ex. :
Si %1 contient
C:\Documents and Settings\All Users\ntuser.dat
syntaxe Chaine retournée
%~dp1 C:\Documents and Settings\All Users\
%~n1 ntuser
%~x1 .dat
%~nx1 ntuser.dat
%~d1 C:
%~p1 \Documents and Settings\All Users\
%~z1 262144 ( ou une autre taille)
%~a1 --a------
%~t1 13/01/2005 17:56 (ou une autre date )
%~fs1 C:\DOCUME~1\ALLUSE~1\ntuser.dat
2. Extraction d'une partie du contenu d'une variable Machin
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
%Machin:~0,2% Retourne les deux premiers caractères
%Machin:~5,3% Retourne trois caractères en partant du sixième
%Machin:~8% Retourne tout les caractères à partir du neuvième
%Machin:~2,-4% Retourne tout les caractères à partir du troisième
sauf les quatre derniers
%Machin:-7% Retourne les sept derniers caractères
Par exemple :
%date:~6,4%-%date:~3,2%-%date:~0,2%
Retourne la date sous la forme aaaa-mm-jj
3. Transformation du contenu d'une variable Machin
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
%Machin:ch1=ch2% balaye Machin à la recherche de ch1
et remplace chaque ch1 trouvé
par ch2
Exemples
%path:windows=VinDo%
Remplace chaque occurrence de « windows »
par « VinDo » dans la variable PATH
et retourne le résultat.
cela ne semble fonctionner que quand %a est dans le corps d'un FOR ...
J'ai donné un exemple avec un Call à un sous-programme. Mais, bon, je ne pense pas que ce soit d'un usage très universel. Perso, je n'ai jamais employé ça en production.
@+ -- Michel Claveau
Re !
J'ai bon cette fois ?
Mais oui.
cela ne semble fonctionner que quand %a est dans le corps d'un FOR ...
J'ai donné un exemple avec un Call à un sous-programme.
Mais, bon, je ne pense pas que ce soit d'un usage très universel.
Perso, je n'ai jamais employé ça en production.
cela ne semble fonctionner que quand %a est dans le corps d'un FOR ...
J'ai donné un exemple avec un Call à un sous-programme. Mais, bon, je ne pense pas que ce soit d'un usage très universel. Perso, je n'ai jamais employé ça en production.
@+ -- Michel Claveau
moi
Bonsoir,
Je tente de me faire un résumé des possibilités existantes
J'avance ...
J'en suis à Set /a
et modulo me pose pb
set /a Q#%7 et set /a Q="23%7"
retournent bien 2 en ligne de commande mais 23 dans un bat ... euh ... ( ... la variable %7 était vide, certes, mais le /a ... quand même )
HB
Bonsoir,
Je tente de me faire un résumé des possibilités existantes
J'avance ...
J'en suis à Set /a
et modulo me pose pb
set /a Q#%7
et
set /a Q="23%7"
retournent bien 2 en ligne de commande
mais 23 dans un bat ... euh ...
( ... la variable %7 était vide, certes,
mais le /a ... quand même )
! inverse la "logique". La logique, c'est 0 ou 1 (et c'est tout). Exemple :
@echo off setlocal
set /AX=!1 echo X=%X%
set /AX=!0 echo X=%X%
endlocal
Cela peut servir pour les IF et autres ERRORLEVEL
@+ -- Michel Claveau
moi
Méta-MCI (MVP) wrote:
Re !
! inverse la "logique". La logique, c'est 0 ou 1 (et c'est tout).
Eau-Quai !!!
Effectivement c'est donc un "not" simple tandis que ~ semblerait être un not "bit à bit"
Bon bin là ... je suis à peu près au clair sur Set /a
Je vais pouvoir passer à autre chose ;o) :
J'ai décidé ( hop!) de passer aux histoire de "pipe" (|) j'ai toujours écarté ces questions... l'occasion se présente :
J'ai une "moulinette" qui manipule certaines entrées pour fabriquer une sortie. Comme cette manip est un peu longue, il serait rentable pour la clarté du code de faire un appel vers une procédure dédiée puis de récupérer le résultat
exemple :
:: .... Call :MaFonc 7 3 29 | set /p Retour :: ... suite
:: ======================= :MaFonc :: je prend %1, %2 et %3 :: je touille :: je fais mijoter :: je fabrique un résultat R et je l'envoie en sortie :: exemple idiot juste pour utiliser set /a ;o) setlocal set /a R=(%1+%3)/%2+(%1+%2)/%3 echo %R% endlocal goto :EOF :: ======================= J'ai fais plusieurs tests mais ça n'a pas l'air de marcher j'aurais pourtant cru ... La valeur contenu dans Retour est soit vide soit une précédente valeur qui a marché en mettant en clair l'affectation avec un truc du type :
=================================== :FoncBis set /a Retour=(%1+%3)/%2+(%1+%2)/%3 goto :EOF =================================== et l'appel
Call :FoncBis 15 2 8
suffit pour remplir %Retour%
Donc d'une certaine façon je m'en sort mais comme je voudrais savoir comment fonctionne ces histoire de pipe l'occasion est ratée ...
Y-a-t-il une ruse ou bien est-ce illusoire ?
A+
HB
Méta-MCI (MVP) wrote:
Re !
! inverse la "logique". La logique, c'est 0 ou 1 (et c'est tout).
Eau-Quai !!!
Effectivement c'est donc un "not" simple
tandis que ~ semblerait être un not "bit à bit"
Bon bin là ... je suis à peu près au clair sur Set /a
Je vais pouvoir passer à autre chose ;o) :
J'ai décidé ( hop!) de passer aux histoire de "pipe" (|)
j'ai toujours écarté ces questions... l'occasion se présente :
J'ai une "moulinette" qui manipule certaines entrées pour fabriquer
une sortie.
Comme cette manip est un peu longue, il serait rentable pour la clarté
du code de faire un appel vers une procédure dédiée puis de récupérer
le résultat
exemple :
:: ....
Call :MaFonc 7 3 29 | set /p Retour :: ... suite
:: ======================= :MaFonc
:: je prend %1, %2 et %3
:: je touille
:: je fais mijoter
:: je fabrique un résultat R et je l'envoie en sortie
:: exemple idiot juste pour utiliser set /a ;o)
setlocal
set /a R=(%1+%3)/%2+(%1+%2)/%3
echo %R%
endlocal
goto :EOF
:: =======================
J'ai fais plusieurs tests mais ça n'a pas l'air de marcher
j'aurais pourtant cru ...
La valeur contenu dans Retour
est soit vide soit une précédente valeur
qui a marché en mettant en clair l'affectation avec
un truc du type :
=================================== :FoncBis
set /a Retour=(%1+%3)/%2+(%1+%2)/%3
goto :EOF
=================================== et l'appel
Call :FoncBis 15 2 8
suffit pour remplir %Retour%
Donc d'une certaine façon je m'en sort
mais comme je voudrais savoir comment fonctionne ces histoire de pipe
l'occasion est ratée ...
! inverse la "logique". La logique, c'est 0 ou 1 (et c'est tout).
Eau-Quai !!!
Effectivement c'est donc un "not" simple tandis que ~ semblerait être un not "bit à bit"
Bon bin là ... je suis à peu près au clair sur Set /a
Je vais pouvoir passer à autre chose ;o) :
J'ai décidé ( hop!) de passer aux histoire de "pipe" (|) j'ai toujours écarté ces questions... l'occasion se présente :
J'ai une "moulinette" qui manipule certaines entrées pour fabriquer une sortie. Comme cette manip est un peu longue, il serait rentable pour la clarté du code de faire un appel vers une procédure dédiée puis de récupérer le résultat
exemple :
:: .... Call :MaFonc 7 3 29 | set /p Retour :: ... suite
:: ======================= :MaFonc :: je prend %1, %2 et %3 :: je touille :: je fais mijoter :: je fabrique un résultat R et je l'envoie en sortie :: exemple idiot juste pour utiliser set /a ;o) setlocal set /a R=(%1+%3)/%2+(%1+%2)/%3 echo %R% endlocal goto :EOF :: ======================= J'ai fais plusieurs tests mais ça n'a pas l'air de marcher j'aurais pourtant cru ... La valeur contenu dans Retour est soit vide soit une précédente valeur qui a marché en mettant en clair l'affectation avec un truc du type :
=================================== :FoncBis set /a Retour=(%1+%3)/%2+(%1+%2)/%3 goto :EOF =================================== et l'appel
Call :FoncBis 15 2 8
suffit pour remplir %Retour%
Donc d'une certaine façon je m'en sort mais comme je voudrais savoir comment fonctionne ces histoire de pipe l'occasion est ratée ...
Y-a-t-il une ruse ou bien est-ce illusoire ?
A+
HB
Laurent Dardenne
Bonjour, "moi" wrote:
mais j'avoue que je suis rapidement " à mes limites" ;o( lorsque je veux trouver des exemples pertinents ...
L'usage de SetLocal/EndLocal permet la création de pile/portée, un exemple de batch récursif : rem -------------- @echo off rem Créer les répertoires de test dans %Temp%Test rem cd %Temp% rem md Test rem cd test rem md D1sD1sD2;D2sD1sD2;D3sD1sD2 cd %Temp% set Source=%Temp%Test set Cible=%Temp%Test2 rem Echo debut : %Tempo% cd %Source% Set Last=%Cible% set DirCourant :Recurse rem met en place la pile d'appel XP/Vista, W2K ? rem On mémorise (empile) les variables locales à partir de ce point setlocal if not "%DirCourant%"=="" set Last=%Last%%DirCourant%
for /F "Tokens=*" %%I in ('Dir %CD% /AD /B') do set DirCourant=%%~nxI&CALL :Make goto fin
rem Sous-programme de traitement :Make ECHO *DESCENT* info debug Call :VisuDebug
rem Se positionne dans le répertoire courant (1) Cd "%DirCourant%" rem Crée le répertoire courant dans la cible md "%Last%%DirCourant%"
rem effectue le traitement pour le répertoire courant (%CD%%DirCourant%) Echo Fait qq chose de ["%CD%"] vers ["%Last%%DirCourant%"] rem On parcourt les répertoires du répertoire courant
Call :Recurse rem On remonte d'un niveau dans l'arborescence, cf(1) cd..
:Suite rem On rétabli (Dépile) les variables locales de l'appel précédent Endlocal
ECHO *REMONTE* info debug rem Call :VisuDebug Pause debug rem fin du SP Goto :eof :VisuDebug Echo Traitement du répertoire : %CD%%DirCourant% Echo Courant= %DirCourant% Echo LAST = %Last% Echo -------- rem fin du SP Goto :eof :fin set DirCourant set Last set Source set Cible rem chaque appel de recurse se terminera ici !!! Echo Fin du batch rem ---------------------
Bonjour,
"moi" wrote:
mais j'avoue que je suis rapidement " à mes limites" ;o(
lorsque je veux trouver des exemples pertinents ...
L'usage de SetLocal/EndLocal permet la création de pile/portée, un exemple
de batch récursif :
rem --------------
@echo off
rem Créer les répertoires de test dans %Temp%Test
rem cd %Temp%
rem md Test
rem cd test
rem md D1sD1sD2;D2sD1sD2;D3sD1sD2
cd %Temp%
set Source=%Temp%Test
set Cible=%Temp%Test2
rem Echo debut : %Tempo%
cd %Source%
Set Last=%Cible%
set DirCourant :Recurse
rem met en place la pile d'appel XP/Vista, W2K ?
rem On mémorise (empile) les variables locales à partir de ce point
setlocal
if not "%DirCourant%"=="" set Last=%Last%%DirCourant%
for /F "Tokens=*" %%I in ('Dir %CD% /AD /B') do set DirCourant=%%~nxI&CALL
:Make
goto fin
rem Sous-programme de traitement
:Make
ECHO *DESCENT* info debug
Call :VisuDebug
rem Se positionne dans le répertoire courant (1)
Cd "%DirCourant%"
rem Crée le répertoire courant dans la cible
md "%Last%%DirCourant%"
rem effectue le traitement pour le répertoire courant (%CD%%DirCourant%)
Echo Fait qq chose de ["%CD%"] vers ["%Last%%DirCourant%"]
rem On parcourt les répertoires du répertoire courant
Call :Recurse
rem On remonte d'un niveau dans l'arborescence, cf(1)
cd..
:Suite
rem On rétabli (Dépile) les variables locales de l'appel précédent
Endlocal
ECHO *REMONTE* info debug
rem Call :VisuDebug
Pause debug
rem fin du SP
Goto :eof
:VisuDebug
Echo Traitement du répertoire : %CD%%DirCourant%
Echo Courant= %DirCourant%
Echo LAST = %Last%
Echo --------
rem fin du SP
Goto :eof
:fin
set DirCourant set Last set Source set Cible rem chaque appel de recurse se terminera ici !!!
Echo Fin du batch
rem ---------------------
mais j'avoue que je suis rapidement " à mes limites" ;o( lorsque je veux trouver des exemples pertinents ...
L'usage de SetLocal/EndLocal permet la création de pile/portée, un exemple de batch récursif : rem -------------- @echo off rem Créer les répertoires de test dans %Temp%Test rem cd %Temp% rem md Test rem cd test rem md D1sD1sD2;D2sD1sD2;D3sD1sD2 cd %Temp% set Source=%Temp%Test set Cible=%Temp%Test2 rem Echo debut : %Tempo% cd %Source% Set Last=%Cible% set DirCourant :Recurse rem met en place la pile d'appel XP/Vista, W2K ? rem On mémorise (empile) les variables locales à partir de ce point setlocal if not "%DirCourant%"=="" set Last=%Last%%DirCourant%
for /F "Tokens=*" %%I in ('Dir %CD% /AD /B') do set DirCourant=%%~nxI&CALL :Make goto fin
rem Sous-programme de traitement :Make ECHO *DESCENT* info debug Call :VisuDebug
rem Se positionne dans le répertoire courant (1) Cd "%DirCourant%" rem Crée le répertoire courant dans la cible md "%Last%%DirCourant%"
rem effectue le traitement pour le répertoire courant (%CD%%DirCourant%) Echo Fait qq chose de ["%CD%"] vers ["%Last%%DirCourant%"] rem On parcourt les répertoires du répertoire courant
Call :Recurse rem On remonte d'un niveau dans l'arborescence, cf(1) cd..
:Suite rem On rétabli (Dépile) les variables locales de l'appel précédent Endlocal
ECHO *REMONTE* info debug rem Call :VisuDebug Pause debug rem fin du SP Goto :eof :VisuDebug Echo Traitement du répertoire : %CD%%DirCourant% Echo Courant= %DirCourant% Echo LAST = %Last% Echo -------- rem fin du SP Goto :eof :fin set DirCourant set Last set Source set Cible rem chaque appel de recurse se terminera ici !!! Echo Fin du batch rem ---------------------