OVH Cloud OVH Cloud

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

8 réponses

1 2
Avatar
Méta-MCI \(MVP\)
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.


@+
--
Michel Claveau
Avatar
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
Avatar
Méta-MCI \(MVP\)
Bonjour !

Essaie avec :
set /A AA#%%7

@-salutations
--
Michel Claveau
Avatar
Méta-MCI \(MVP\)
Bonjour !

Un petit exemple, qui va sûrement t'amuser :

@echo off

setlocal
set /A X1
echo X_debut=%X%

setlocal
echo X_avant=%X%
set /A X"2
echo X_apres=%X%

setlocal enabledelayedexpansion
echo X_expan=!X!
endlocal
echo X_non-expan=!X!

endlocal

echo X_final=%X%
endlocal




@+
--
Michel Claveau
Avatar
moi
Bonjour,


Méta-MCI (MVP) wrote:
Essaie avec :
set /A AA#%%7



J'aurais du y songer ...

Je viens de voir l'autre message avec le "petit exemple".
J'ignorais que l'on pouvait imbriquer les zones

SetLocal
...
EndLocal

Le jeu consiste à deviner avant ce qui va s'afficher
sinon ce n'est pas rigolo ;o)


Dernière chose sur Set /a ...

Les trois opérateurs unaires :

-n donne effectivement l'opposé de n
c'est assez normal
~n retourne -(n+1) ( pourquoi pas ...)
!n retourne toujours zéro ????????

J'imagine, cependant que cela possède une utilité .....
mais pour "!" je ne vois pas trop .

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

! 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
Avatar
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
Avatar
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 ---------------------
1 2