OVH Cloud OVH Cloud

Script "cmd" : une colle aux initiés ? Ou un défi...

11 réponses
Avatar
blaigle
Bonjour ;

J'ai un d=E9fi =E0 lancer aux sp=E9cialistes des scripts "cmd" de Windows
NT/2000/XP/...
Ce n'est pas juste pour le plaisir de poser une colle, car =E7a me
rendrait bien service d'avoir la solution !!

Je recherche un moyen pour remplace, dans une cha=EEne de caract=E8res
(en fait, dans une variable) tout caract=E8re '*' par un '%' (ou =E0 la
limite par n'importe quoi, le probl=E8me =E9tant l'=E9toile, en fait).
J'ai pens=E9 =E0 quelque chose comme :

set var=3D%var:*=3D%%%

ou, si l'on utilise l'expansion retard=E9e :

set var=3D!var:*=3D%%!

mais =E7a ne marche pas, car '*' est un caract=E8re sp=E9cial. Je pense
avoir essay=E9 tout ce que je pouvais imaginer, du style :

set var=3D%var:^*=3D%%%
set var=3D%var:^^*=3D%%%
set var=3D%var:^^^*=3D%%%
set var=3D%var:\*=3D%%%
set var=3D%var:\\*=3D%%%
set var=3D%var:\\\*=3D%%%

=3D> Quelqu'un pourrait-il me dire comment proc=E9der ? Sinon il faut
faire une boucle pour extraire un par un les caract=E8res de la variable
etc... (a priori, j'ai ce qu'il faut pour =E7a), mais c'est moins
=E9l=E9gant et bien plus long =E0 ex=E9cuter (car la substitution
souhait=E9e s'inscrit dans une boucle...) !!
Alors ?...=20
Merci d'avance pour vos id=E9es !

Bertrand.

10 réponses

1 2
Avatar
Méta-MCI
Bonjour !


J'ai une solution, avec un utilitaire maison.
Mais, là vu que je suis en vacances, il faudra attendre mon retour...


@-salutations
--
Michel Claveau
Avatar
blaigle
Bonsoir ;

Merci, mais si c'est un exécutable cela ne peut - hélas - pas me
convenir.
C'est très bête, mais il me faut absolument une solution en script
cmd "pur" (à défaut, je me débrouillerai autrement).

Bien cordialement,
Bertrand.
Avatar
fth
Bonjour,

je ne sais pas si tu as trouvé ta solution..?
en lisant le poste, je me demandais si tu ne pourrais pas remplacer l'étoile
par son code ascii qui lui, n'est pas un caractère spéciale
Et idem pour le caractère de remplacement.

A+

Frédéric


wrote in message
news:
Bonjour ;

J'ai un défi à lancer aux spécialistes des scripts "cmd" de Windows
NT/2000/XP/...
Ce n'est pas juste pour le plaisir de poser une colle, car ça me
rendrait bien service d'avoir la solution !!

Je recherche un moyen pour remplace, dans une chaîne de caractères
(en fait, dans une variable) tout caractère '*' par un '%' (ou à la
limite par n'importe quoi, le problème étant l'étoile, en fait).
J'ai pensé à quelque chose comme :

set var=%var:*=%%%

ou, si l'on utilise l'expansion retardée :

set var=!var:*=%%!

mais ça ne marche pas, car '*' est un caractère spécial. Je pense
avoir essayé tout ce que je pouvais imaginer, du style :

set var=%var:^*=%%%
set var=%var:^^*=%%%
set var=%var:^^^*=%%%
set var=%var:*=%%%
set var=%var:*=%%%
set var=%var:*=%%%

=> Quelqu'un pourrait-il me dire comment procéder ? Sinon il faut
faire une boucle pour extraire un par un les caractères de la variable
etc... (a priori, j'ai ce qu'il faut pour ça), mais c'est moins
élégant et bien plus long à exécuter (car la substitution
souhaitée s'inscrit dans une boucle...) !!
Alors ?...
Merci d'avance pour vos idées !

Bertrand.
Avatar
Méta-MCI
Bonsoir !

J'ai trouvé un moyen, mais c'est pas bô du tout.
Juges-en :

@echo off
set var=AZ*RTY
set b call :CHAR %var:~0,1%
call :CHAR %var:~1,1%
call :CHAR %var:~2,1%
call :CHAR %var:~3,1%
call :CHAR %var:~4,1%
call :CHAR %var:~5,1%
call :CHAR %var:~6,1%
call :CHAR %var:~7,1%
call :CHAR %var:~8,1%
call :CHAR %var:~9,1%
call :CHAR %var:~10,1%
call :CHAR %var:~11,1%
call :CHAR %var:~12,1%
call :CHAR %var:~13,1%
call :CHAR %var:~14,1%
call :CHAR %var:~15,1%
call :CHAR %var:~16,1%
call :CHAR %var:~17,1%
call :CHAR %var:~18,1%
call :CHAR %var:~19,1%
echo %b%
goto :EOF

:CHAR
if NOT [%1]==[] if [%1]==[*] (set b=%b%%%) else (set b=%b%%1)
goto :EOF



Valable pour une chaîne de 20 caractères maxi.


@+

MCI
Avatar
Méta-MCI
Re

Une autre méthode, un peu moins laide, qui remplace jusqu'à 5 étoiles :

@echo off
set var=1*2*3*4*5*6

for /F "tokens=1-26 delims=*" %%a in ("%var%") DO call :FUS %%a %%b %%c %%d
%%e %%f
echo %b%
goto :EOF

:FUS
set b if NOT [%1]==[] set b=%b%%1
if NOT [%2]==[] set b=%b%%%%2
if NOT [%3]==[] set b=%b%%%%3
if NOT [%4]==[] set b=%b%%%%4
if NOT [%5]==[] set b=%b%%%%5
if NOT [%6]==[] set b=%b%%%%6
goto :EOF




@+
--
MCI
Avatar
blaigle
Bonjour à tous ;

Eh bien, je vois qu'il n'existe apparemment pas de méthode plus simple
qu'un sous-programme ; l'idée de Frédéric ("fth") est intéressante
mais je ne vois pas trop comment spécifier un code ASCII dans un
script "cmd".
Merci pour vos idées astucieuses, mais toutes sont limitées en nombre
de caractère traités et, pour la beauté de la chose, je préférais
un mode "illimité". J'ai finalement réglé le problème par le
sous-programme suivant :

:SsPrg_RemplEtoiles
REM Remplace toute occurrence du caractère '*' par un '%%' (càd au
final un caractère '%')
REM
REM Arguments : chaîne
REM
REM Renvoie (affiche) le résultat.
REM

setlocal enableextensions

set var=%*

set res=
set c=%var:~,1%

:Boucle_RemplEtoiles
if "%c%"=="*" set c=%%
set res=%res%%c%
set var=%var:~1%
if "%var%"=="" (set c=) else (set c=%var:~,1%)
if not "%c%"=="" goto Boucle_RemplEtoiles

echo %res%

Voilà, si d'aventure quelqu'un trouve une méthode plus simple, ne pas
hésiter à m'en faire part par e-mail !
Bien cordialement,
Bertrand.
Avatar
Méta-MCI
Re

D'abord, la même méthode que toi :

@echo off
set var=AZE*R***TYUIOP
set res
:DEB
if "%var:~0,1%"=="*" (set res=%res%%%) else (set
res=%res%%var:~0,1%)
set var=%var:~1,255%
if NOT "%var%"=="" GOTO :DEB

echo %res%



Ensuite, une dérivée, plus marrante :

@echo off
set var=AZE*R***TYUIOP

set res call :CHANGETOILE %var%
echo %res%
goto :EOF

:CHANGETOILE
if "%*"=="" GOTO :EOF
set c=%*
if "%c:~0,1%"=="*" (set res=%res%%%) else (set
res=%res%%c:~0,1%)
call :CHANGETOILE %c:~1,255%



Cette dernière méthode est interessante, car plus facile à réutiliser,
puisque c'est un sous-programme.

@+

MCI
Avatar
Méta-MCI
Re

Il est mieux de remplacer la dernière ligne de la seconde méthode, par
celle-ci

call :CHANGETOILE %c:~1%


Je ne sais pas où j'avais la tête....

@+

Michel Claveau
Avatar
blaigle
Bien vu, en effet. Ta 1ere méthode donne une exécution plus rapide
que la mienne, par contre ta 2e "plante" sur les très longues chaînes
à cause de l'empilement des "call"...

Merci ! ;-D
Avatar
Méta-MCI
Salut !

La première méthode est directement inspirée de la tienne.
Pour la seconde, tu as dû essayer avec une très grande chaîne, car chez moi,
c'est OK avec 200 caractères...

Bonne soirée.

MCI
1 2