DOS : manipulation de chaîne ...

DOS : manipulation de chaîne ... - Shell/Batch - Programmation

Marsh Posté le 30-10-2005 à 13:38:14    

Sujet original : http://forum.hardware.fr/hardwaref [...] 1243-1.htm
 
Bonjour  :hello:  
 
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
Reply

Marsh Posté le 30-10-2005 à 13:38:14   

Reply

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 ?

Reply

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 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à ;)

Reply

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.

Reply

Marsh Posté le 30-10-2005 à 14:43:07    

set path=%path:{%systemroot%}\{%new_rep%}=%


 
ca passe pas ca ?


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 30-10-2005 à 14:56:42    

KangOl a écrit :

set path=%path:{%systemroot%}\{%new_rep%}=%


 
ca passe pas ca ?


Non, car { et } sont interprétés comme des simples caractères.
 
Tu peux essayer chez toi.

Reply

Marsh Posté le 30-10-2005 à 14:59:33    

wackevat a écrit :

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.


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
------------------------------

Reply

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
 
@++

Reply

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/


Message édité par wackevat le 30-10-2005 à 19:01:34
Reply

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 :jap:
Merci pour l info


Message édité par arnaud1206 le 30-10-2005 à 19:56:56
Reply

Marsh Posté le 30-10-2005 à 19:55:02   

Reply

Marsh Posté le 30-10-2005 à 19:57:02    

OK, pas de souci. Le forum est là pour ça ;)
 
@+

Reply

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 je vais tester tout ça, et je vous tiendrais au courant si ça fini par marcher ;)

Reply

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
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed