Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

scripts (cmd) et variables

18 réponses
Avatar
moi
bonjour,

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.

%date:/=-%

Retourne la date sous la forme jj-mm-aaaa

10 réponses

1 2
Avatar
moi
"moi" a fait pas mal de fautes
en tappant trop vite :

bonjour,

Je tente de me faire un résumé
des possibilités existentes


^^^
----------------->>>>> et d'une ...

et s'en excuse ...

HB
Avatar
Méta-MCI \(MVP\)
Bonsoir !

Excellent résumé, et bien pratique.
Tu pourrais peut-être ajouter les calculs (SET /A) ; voir SET /? pour
les détails ; mais, sans oublier l'octal ;o)))
Et, peut-être, mentionner les variables pré-définies avec l'expansion
retardée :
%CD% %DATE% %TIME% %RANDOM% %ERRORLEVEL% %CMDEXTVERSION%
%CMDCMDLINE%


@-salutations
--
Michel Claveau
Avatar
MCI \(ex do ré Mi chel la si do\) [MVP]
Oups !
Remplacer "expansion retardée" par "extension de commande"
Merci.

--
MCI
Avatar
---DGI972---
Méta-MCI (MVP) a écrit :
Bonsoir !

Excellent résumé, et bien pratique.
Tu pourrais peut-être ajouter les calculs (SET /A) ; voir SET /? pour les
détails ; mais, sans oublier l'octal ;o)))
Et, peut-être, mentionner les variables pré-définies avec l'expansion
retardée :
%CD% %DATE% %TIME% %RANDOM% %ERRORLEVEL% %CMDEXTVERSION%
%CMDCMDLINE%


@-salutations



C'est pour moi l'octal ?

lol

Petit résumé bien pratique ...
Avatar
moi
Bonsoir,

Méta-MCI (MVP) wrote:
Bonsoir !

Excellent résumé, et bien pratique.



Merci
Dois-je comprend qu'en dehors des choses
citées plus bas, je n'ai rien omis d'important ?

Tu pourrais peut-être ajouter les calculs (SET /A) ; voir SET /?
pour
les détails ; mais, sans oublier l'octal ;o)))



une partie 4. pour les variables numériques
( et donc Set /a ) est effectivement prévue
(.... il faut bien reconnaitre que
peu de gens utilisent l'octal ... et moi même ...)

Et, peut-être, mentionner les variables pré-définies



%CD% %DATE% %TIME% %RANDOM% %ERRORLEVEL%
%CMDEXTVERSION% %CMDCMDLINE%



Oui... Je ne les trouve pas toutes indispensables
mais cd, date, time et errorlevel
servent assez souvent.

En revanche, je compte faire une petite partie avec un ou deux
exemples sur l'expansion retardée qui reste un truc puissant quand on
arrive à le contrôler ;o)
et une autre sur setlocal / endlocal

mais j'avoue que je suis rapidement " à mes limites" ;o(
lorsque je veux trouver des exemples pertinents ...

A+
HB
Avatar
moi
Bonjour,


moi wrote:
bonjour,

Je tente de me faire un résumé des possibilités existantes
concernant la manipulation des variables ...



Suite ... :

J'ai deux questions :

1. Pour "For /F ..."

dans une ligne du type

For /F "skip=1 tokens=2 delims=:" %%u in (%CH%) do (
<actions ...>
)

Si CH contient le nom d'un fichier ça balaye bien son contenu
Mais l'aide (for /?) laisse entendre que l'on peut cibler plusieurs
fichiers

J'ai tenté avec "fichier*.txt"
pour des fichiers numérotés... mais j'échoue ...
Qu'en est-il réellement ?
Qu'ai-je raté ?

2. L'aide de for présente aussi une forme de syntaxe
%~$Variable:i dont je ne saisi ni le but ni le sens ...
où i est une variable de la boucle for

mais peut-être est-ce utilisable hors de ce contexte ?

Merci d'avance,

HB
Avatar
Méta-MCI \(MVP\)
Bonsoir !



Les ensembles de fichiers, ne sont pas valable avec FOR /F
Et, avec un FOR sans /F , le travail est effectué sur le nom des
fichiers, au lieu du contenu d'un fichier.


Pour %~$PATH:i c'est un peu spécial. Il faut que la variable (%i)
contienne un nom de fichier, et l'autre variable, une liste de
répertoires, se terminant par et séparés par un point-virgule.
L'exécution du batch va chercher le fichier (par son nom), dans les
répertoires de la liste. Il s'arrête au premier trouvé, et retourne le
chemin, suivi du nom du fichier.
Un 'chti exemple :

@echo off
setlocal
call :SUB help.jpg
call :SUB wusa.exe
endlocal
goto :EOF

:SUB
set MREP=D:Downloads;C:temp;C:Windowssystem32;D;dev;
echo %~$MREP:1
goto :EOF

Si le fichier n'est pas trouvé, on récupère du vide...


@+
--
Michel Claveau
Avatar
Méta-MCI \(MVP\)
Re !

Par "ensembles de fichiers", je voulais dire "ensembles de fichiers par
des caractères génériques".

@+

MCI
Avatar
moi
Bonsoir,


Méta-MCI (MVP) wrote:
Les ensembles de fichiers, ne sont pas valables avec FOR /F



OK

L'aide de for dit (entre autres !) :
-------------------CITATION-------------------
FOR /F ["options"] %Lettre IN (ensemble-fichiers) DO commande [params]
FOR /F ["options"] %Lettre IN ("chaîne") DO commande [params]
FOR /F ["options"] %Lettre IN ('commande') DO commande [params]

ensemble-fichiers est un ou plusieurs noms de fichiers. Chaque
fichier est
ouvert, lu et traité avant de passer au fichier suivant de
ensemble-fichiers(...)
------------- fin de citation -------------------------

J'en déduis que "ensemble-fichiers" est une liste de fichiers
(séparés par des point-virgules comme d'hab ?)
et non pas un "descripteur" avec "?" et/ou "*"

J'ai bon cette fois ?


Pour %~$PATH:i c'est un peu spécial. Il faut que la variable (%i)
contienne un nom de fichier, et l'autre variable, une liste de
répertoires, se terminant par et séparés par un point-virgule.
L'exécution du batch va chercher le fichier (par son nom), dans les
répertoires de la liste. Il s'arrête au premier trouvé, et retourne
le
chemin, suivi du nom du fichier.




effectivement ... le qualificatif "spécial" est assez adapté !
J'entrevois même l'utilité de cette chose ... c'est dire
euh ...
... pour rechercher un fichier
dans une série d'endroits ...

Je vais tester pour vérifier que j'ai compris ;o))))

Merci beaucoup pour ces précisions

HB
Avatar
moi
Re,

Je vais tester pour vérifier que j'ai compris ;o))))




J'ai testé ...

Pour %~$LISTE:a
cela ne semble fonctionner que quand %a
est dans le corps d'un FOR ...
( et comme c'est %%a dans un *.bat
cela donne %%~$LISTE:a )

Merci,

A+
1 2