DOS : manipulation de chaîne ... - Shell/Batch - Programmation
Marsh Posté le 30-10-2005 à 13:45:38
Ah oui j'y avais pas pensé !!! Mais je débute sous dos et la manipulation de chaîne je connais pas vraiment.  
 
En gros tu utilises quoi comme commande pour bidouiller les chaîne de caractère ?
Marsh Posté le 30-10-2005 à 14:34:50
Bonjour,  
  
Le remplacement des caractères dans une chaîne par :  
%path:ch1=ch2%  
ne fonctionne qu'avec une valeur et non pas avec une variable.  
  
En effet, ton expression  
%path:%systemroot%\%new_rep%=%  
est interprétée comme une concaténation de :  
- la valeur de la variable path: %path:%  
- suivie de la chaîne : systemroot  
- puis la valeur de la variable \ : %\%  
- la chaîne new_rep  
- et enfin, la valeur de la variable = : %=%  
  
{%path:%systemroot%\%new_rep%=%}={%path:%}+{systemroot}+{%\%}+{new_rep}+{%=%} 
 
Pour ton problème, tu peux effectivement utiliser une boucle 
for 
avec comme délimiteur le point-virgule ( , pour extraire les chemins du PATH actuel et recalculer sa nouvelle valeur.
, pour extraire les chemins du PATH actuel et recalculer sa nouvelle valeur. 
 
Pour chaque valeur récupérée, tu la compares avec 
%systemroot%\%new_rep% 
afin de décider si elle est à concaténer au nouveau PATH. 
 
Voilà 
Marsh Posté le 30-10-2005 à 14:36:45
PS : et je tiens à préciser que ce n'est pas du DOS ce que tu essaies à faire. C'est l'invite de commandes Windows, dont la syntaxe est beaucoup plus évoluée que celle du DOS d'antan.
Marsh Posté le 30-10-2005 à 14:43:07
| set path=%path:{%systemroot%}\{%new_rep%}=% | 
 
 
ca passe pas ca ?
Marsh Posté le 30-10-2005 à 14:56:42
| KangOl a écrit : 
   | 
 
Non, car { et } sont interprétés comme des simples caractères. 
 
Tu peux essayer chez toi.
Marsh Posté le 30-10-2005 à 14:59:33
| wackevat a écrit : Pour ton problème, tu peux effectivement utiliser une boucle  | 
 
Je me reprends  
 
 
En "trichant" un peu, on peut y arriver comme ça : 
------------------------------ 
@echo off 
 
setlocal enableExtensions 
 
set PATHTMP="%PATH:;=" "%" 
call :getPATH %PATHTMP% 
goto end 
 
:getPATH 
if "%~1" neq "" ( 
  echo %~1 
  shift 
  goto getPATH 
) 
 
:end 
endlocal&&goto :eof 
------------------------------
Marsh Posté le 30-10-2005 à 18:48:58
Salut 
 
Je reviens de lire ton premier post et tu connais le contenu %systemroot%\%new_rep% qui est C:\WINDOWS\extratools alors pourquoi ne pas faire tout simplement  
set pathtemp="%PATH:;C:\WINDOWS\extratools=" "" 
 
@nglechau 1/connais tu un bon bouquin sur le batch en windows??? 
               2/sympa ce cassage de chaine je vais le garder dans un coin 
 
@++
Marsh Posté le 30-10-2005 à 19:01:07
Pour le premier point : je pense que antolionux voudrait le faire dans un cas général, par exemple, pour le déployement sur un poste où Windows n'est pas nécessairement installé sur C et/ou dans un dossier appelé Windows. 
 
Pour ta question : je ne connais pas ton niveau. Si pour débuter, télécharge PowerBatch qui inclut un tuto sympa. Autrement, le meilleur site à mon avis est : 
http://www.robvanderwoude.com/
Marsh Posté le 30-10-2005 à 19:55:02
Je m y remets tout doucement les souvenirs sont loins, le pb c est que j etais en unix et je repasse a windows.Alors niveau algo ca va les pbs sont les outils a ma disposition et surtout la syntaxe,enfin maintenant ca va mieux pour les % %% et ! grace a toi  
 
Merci pour l info
Marsh Posté le 30-10-2005 à 22:13:25
Et bien je vois que ma question a eu du succès  , en tout cas merci à tous pour votre aide, j'ai maintenant plusieurs pistes à exploiter. Je pige encore pas tout, car ça fait que quelques jours que j'ai appris à faire des batch.
, en tout cas merci à tous pour votre aide, j'ai maintenant plusieurs pistes à exploiter. Je pige encore pas tout, car ça fait que quelques jours que j'ai appris à faire des batch. 
 
En tout cas je vais tester tout ça, et je vous tiendrais au courant si ça fini par marcher 
Marsh Posté le 17-10-2008 à 17:54:49
A toutes fins utiles, voici une réponse à ce problème non trivial... 
Cette solution est sous la forme d'une fonction 
 
 
Exemples d'appel dans un script bat :  
call:remplacerSousChaine bonjour#VARIABLE#monde #VARIABLE# le 
echo %chaineReponse% 
--> affichera : "bonjourlemonde" 
 
Du coup pour le message initial, la solution est : 
call:remplacerSousChaine "%path%" "%systemroot%\%new_rep%" "" 
 
Voici la fonction : 
 
REM ------------------------------------------------------------------------------------------------------------- 
REM Cette fonction permet de remplacer dans une variable donnée du texte par un autre 
REM Préconditions 
REM  * la variable d'environnement %chaineReponse% ne doit pas être initialisée, car elle va être utilisée au cours des traitements internes de cette fonction 
REM	* les droits en écriture sur le répertoire courant doivent être attribués à ce script, car celui-ci utilise un fichier temporaire. 
REM parametres : 
REM   %1  : le texte complet, dont il faut remplacer une sous-chaîne "%chaineARemplacer% par une autre %chaineDeRemplacement% 
REM   %2  : le texte dont il faut remplacer une sous-chaîne par une autre 
REM   %3  : le texte de remplacement. 
REM 
REM Si des espaces sont contenus dans les paramètres, il est nécessaire d'encapsuler ces paramètres par des doubles cotes 
REM  
REM Exemples d'appels  
REM  
REM    call:remplacerSousChaine "bonjour #ARTICLE# monde !" #article# le 
REM    ---> retournera "bonjour le monde" (sans les guillemets 
REM    call:remplacerSousChaine bonjour#ARTICLE#monde #article# le 
REM    ---> retournera "bonjourlemonde" (sans les cotes) 
REM Post-conditions 
REM	* la variable %chaineReponse% contient le texte %chaineDeTravail% dans lequel toutes les occurrences de %chaineARemplacer% ont été substituées par %chaineDeRemplacement% 
REM ------------------------------------------------------------------------------------------------------------- 
:remplacerSousChaine 
  
 
 REM ATTENTION, pour toute évolution dans cette fonction, faire très attention à ne pas mettre d'espace 
 REM dans les instructions, car cela génèrera une réponse avec espaces ! 
 call:supprimerQuotes %1 
 set chaineDeTravail=%reponseSupprimerQuotes% 
 call:supprimerQuotes %2 
 set chaineARemplacer=%reponseSupprimerQuotes% 
 call:supprimerQuotes %3 
 set chaineDeRemplacement=%reponseSupprimerQuotes% 
   
 set partiedroite=%%chaineDeTravail:%chaineARemplacer%=%chaineDeRemplacement%%% 
  
 set instruction=set chaineReponse=%partiedroite% 
 
 rem le nom du fichier bat que l'on va générer pour l'occasion... 
 set FICHIER_BAT_TMP=lance.bat 
  
 rem le nom du fichier reponse dans lequel le fichier bat temporaire va écrire son résultat. 
 set FICHIER_REPONSE_TMP=reponse.txt 
   
 rem on supprime le bat temporaire et son fichier de réponse associé 
 if exist %FICHIER_BAT_TMP% del %FICHIER_BAT_TMP% 
 if exist %FICHIER_REPONSE_TMP% del %FICHIER_REPONSE_TMP% 
  
 echo @echo off > %FICHIER_BAT_TMP% 
 echo set chaineDeTravail=%chaineDeTravail%>>%FICHIER_BAT_TMP% 
 echo %instruction%>>%FICHIER_BAT_TMP% 
 echo echo %%chaineReponse%%^>%FICHIER_REPONSE_TMP%>>%FICHIER_BAT_TMP% 
 echo exit >> %FICHIER_BAT_TMP% 
  
 cmd /C %FICHIER_BAT_TMP% 
 
 FOR /F "delims=," %%i IN (%FICHIER_REPONSE_TMP%) DO set chaineReponse=%%i 
 
 rem suppression du fichier temporaire de réponse... 
 del %FICHIER_REPONSE_TMP% 
 del %FICHIER_BAT_TMP% 
goto:eof 
 
REM Cette fonction supprime les guillemets éventuels du paramètre 
REM Le résultat est stocké sous %reponseSupprimerQuotes% 
:supprimerQuotes 
  set str=%1 
  for /f "useback tokens=*" %%a in ('%str%') do set str=%%~a 
  set reponseSupprimerQuotes=%str% 
goto:eof 
 
Marsh Posté le 30-10-2005 à 13:38:14
Sujet original : http://forum.hardware.fr/hardwaref [...] 1243-1.htm
 
  
 
 
Bonjour
La commande ci-dessous est censé supprimer C:\WINDOWS\extratools ( %systemroot%\%new_rep% ) de la variable PATH, mais ça ne fonctionne pas :
set path=%path:%systemroot%\%new_rep%=%
note : %path:ch1=ch2% permet de remplacer ch1 par ch2 dans la variable path (cf : aide de SET sous DOS)
Donc dans mon cas :
 ch1 vaut %systemroot%\%new_rep%
 ch2 vaut une chaîne vide
ça fait déjà plusieurs jours que je me creuse la tête sur ce problème, alors si quelqu'un peut m'aider ça serait super sympas
D'avance merci
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
Réponse de : arnaud1206
Salut
Essaie de le poster sur programmation shell/batch
Ce que tu peux faire c est au lieu de supprimer ce qui te derange, c est d affecter a la varible path la chaine que tu veux
Tu mets le contenu de ta variable dans un fichier texte, tu la casses a chaque ; et ensuite tu reconstruis la chaine que tu veux en n affichant que les lignes ne contenant pas %systemroot%\%new_rep%
( tout se fait avec for /F ) et pas trop de pbs de syntaxes car la syntaxe des % n est pas toujours aisee et j ai aussi essaye ton cas et moi aussi pb de syntaxe alors ;oyen detourne
@++
Message édité par antolionux le 30-10-2005 à 13:41:12