Script "cmd" : une colle aux initiés ? Ou un défi...
11 réponses
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 !
J'ai une solution, avec un utilitaire maison. Mais, là vu que je suis en vacances, il faudra attendre mon retour...
@-salutations -- Michel Claveau
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.
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).
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.
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.
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
<blaigle@club-internet.fr> wrote in message
news:1146745589.301948.13260@i40g2000cwc.googlegroups.com...
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 !
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.
Méta-MCI
Bonsoir !
J'ai trouvé un moyen, mais c'est pas bô du tout. Juges-en :
: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
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
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
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
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.
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.
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.
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
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.
@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
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
Re
Il est mieux de remplacer la dernière ligne de la seconde méthode, par
celle-ci
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
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
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"...
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
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
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...
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...