Comment rechercher et remplacer sous cmd?

Edit: lien pour télécharger Switch
Bonjour, je viens demander de l’aide parce que je n’arrive pas à rechercher et remplacer une chaîne de caractère par une autre sous cmd avec switch.exe pour un fichier voici le code que j’ai essayer

:chemin
Set "chemin1=Z:\Source\data\design\buildings\industry\businessservice\b_office30_t2.class"
:commande
Set "chaine1=<ResourceNumber>dec</ResourceNumber>"
Set /a resultat=%dec%*5
Set "chaine2=<ResourceNumber>%resultat%</ResourceNumber>"
"C:\Windows\System32\switch.exe" %chemin1% "%chaine1%" "%chaine2%"

j’ai tester ça ne marche pas ça ne donne pas du tout le resultat que je veut.
Ce que je veut c’est remplacer

<ResourceNumber>dec</ResourceNumber>

par

<ResourceNumber>%resultat%</ResourceNumber>

bien sur dec peut être n’importe quel nombre décimal et %resultat% ce nombre multiplier par 5.

Ensuite quand tout celà sera aux point je voudrais savoir comment faire pour rechercher et remplacer une chaîne de caractère par une autre sous cmd mais là sur plusieurs fichiers d’un seul coup avec condition si pour le de fichier si le fichier à le bon nom il est traiter si non fichier suivant.

Et à oui pour vérifier si le fichier à bien la ligne suivante à traiter

   <Production1> 
    <ResourceName>ROFF_0</ResourceName> 
    <ResourceNumber>dec</ResourceNumber> 
    <ResourceUnitMinPriceBenef>dec</ResourceUnitMinPriceBenef> 
   </Production1>

sinon fichier suivant comment on fait?

Aussi je voudrais remplacer sur plusieurs lignes avec différent variable exemple

  <MaxJobPerCulture> 
   <AllAm>2</AllAm> 
   <Suit>2</Suit> 
  </MaxJobPerCulture>

pour traiter

<AllAm>2</AllAm>

et

<Suit>2</Suit>

séparément mais bien entre les 2 lignes suivante

  <MaxJobPerCulture>

et

  </MaxJobPerCulture>

le nombre de ligne pour entre

  <MaxJobPerCulture>

et

  </MaxJobPerCulture>

est variable il peut y avoir de 1 ligne à 4 lignes donc pour

  <MaxJobPerCulture>

et

  </MaxJobPerCulture>

qui sont des variables de début et de fin il peut y avoir entre 1 ligne et 4 lignes
exemple

  <MaxJobPerCulture> 
   <Low>2</Low> 
   <AllAm>2</AllAm> 
   <Suit>2</Suit> 
   <Elite>2</Elite> 
  </MaxJobPerCulture>

donc pour

   <Low>2</Low>

ou

   <AllAm>2</AllAm>

ou

   <Suit>2</Suit>

ou

   <Elite>2</Elite>

il peut y avoir 0 ligne à 3 lignes qui les sépare de

  <MaxJobPerCulture>

et

  </MaxJobPerCulture>

.

Autre question Pour remplacer n’importe quel chiffre sous cmd c’est quoi le caractère bonus?
Edité le 07/09/2011 à 14:13

Edité le 10/02/2012 à 14:20

Rebonjour je n’ai toujours pas résolu le problème bien que j’ai pu faire une partie de code opérationnel le voici

@echo on
:chemin
set "chemin1='dir "Z:\source\*t2.*" /b /s /-c /a:-d-s-h'"
set "chemin2="Z:\source\data\design\buildings\industry\businessservice\b_office30_t2.class""
:fichier
for /f "delims=" %%i in (%chemin1%) do (call :fichierencours %%i)
:fichierencours
set disque=%~d1&
set chemin3=%~p1&
set chemin4=%chemin3:~8%
set chemin5="Z:\destination X2\%chemin4%%nom%%extension%"
set nom=%~n1&
set extension=%~x1
set chemin6=%disque%%chemin3%%nom%%extension%
set Rep1="Z:\destination X2\%chemin4%"
set Rep1md=md %Rep1%
:variable
set "variable1=[0-9]*"
set "chaine1=<ResourceNumber>%variable1%</ResourceNumber>"
for /f "delims=" %%a in ('findstr "%chaine1%" %1') do (%%a
%Rep1md%
echo set "chaine2=%%a">>%chemin5%)

Notez que certaines variable set ne serve pas pour l’instant!
En gros ça dis pour l’étiquette :fichier tout les fichiers qui commence par n’importe quoi en nom et qui se termine par t2 juste avant l’extension et ayant n’importe quel extension ainsi des fichiers des sous dossiers du répertoire source dans le lecteur Z: avec arborescent de dossiers et non.extension des fichiers préserver qui va dans :fichierencours la variable %chemin6% c’est l’adresse complète du fichier en cours, %chemin5% celui du fichier de sortie %Rep1% le répertoire de sortie et %Rep1md% la création du répertoire de sortie si il n’existe pas.

MediaXPIntel
Edité le 11/09/2011 à 11:30

Tu es sûr du fonctionnement de ton switch.exe ?
C’est un programme que tu as l’habitude d’utiliser ?
tu as une description de la syntaxe à utiliser ?
Pourquoi des guillemets autour des deux chaines de caractères et pas autour du nom du fichier à traiter ?

Fais d’abord l’essai avec un fichier placé dans ton répertoire de travail, et ne contenant que des caractères qui ne risquent pas d’être interprétés par le DOS (genre , < > etc.)
Idem pour les chaines, bien entendu.
Ça te permettra peut être d’avancer dans ta recherche.

Bonjour gcc le chemin du fichier à traiter il est dans une variable set celui qui est tout en haut avec l’exemple Switch.exe la variable Set “chemin1=Z:\Source\data\design\buildings\industry\businessservice\b_office30_t2.class” d’ailleurs donc aux moins pour le %chemin1% j’ai pas besoin de guillemet ça marche pour trouver le fichier, mais pas le reste du code pour trouver et remplacer la chaine à traiter ça ne marche pas j’arrive pas à remplacer

<ResourceNumber>dec</ResourceNumber>

par

<ResourceNumber>%resultat%</ResourceNumber>

qui pour rappel dec peut être n’importe quel nombre décimal et %résultat% son résultat multiplier par 5 bien là je n’avais bien sur fait qu’un exemple de code de ce que je voulez dans mon 1er message, qu’en à mon 3ème message c’est une partie de code opérationnel mais pas totalement exemple l’étiquette :fichierexist ne marche pas j’arrive à faire ce que j’ai demander plus haut pour l’étiquette :fichierexist le reste du code avant l’étiquette :fichierexist lui fonctionne je l’ai tester, et c’est rechercher et remplacer avec Switch ou non du moment ou la syntaxe et le remplacement est correct.

Aussi comment extrait un nombre entre 2 balise exemple si

<ResourceNumber>240</ResourceNumber>

comment extraire 240 dans une variable temporairement pour pouvoir la multiplier par set /a multiplier5=%variablenombretmp%*5 et faire ainsi

<ResourceNumber>1200</ResourceNumber>

de façon automatique pour chaque %variablenombretmp% qui peut bien sur être différente pour chaque ligne.

Aussi comment remplacer sur plusieurs lignes continu comme

   <Production1> 
    <ResourceName>ROFF_0</ResourceName> 
    <ResourceNumber>dec</ResourceNumber> 
    <ResourceUnitMinPriceBenef>dec</ResourceUnitMinPriceBenef> 
   </Production1>

par

   <Production1> 
    <ResourceName>ROFF_0</ResourceName> 
    <ResourceNumber>%resultat%</ResourceNumber> 
    <ResourceUnitMinPriceBenef>dec</ResourceUnitMinPriceBenef> 
   </Production1>

le 2ème nombre entre et lui ne dois pas changer. Puis plusieurs lignes comme ceci d’écrit plus haut

  <MaxJobPerCulture> 
   <Low>2</Low> 
   <AllAm>2</AllAm> 
   <Suit>2</Suit> 
   <Elite>2</Elite> 
  </MaxJobPerCulture>

.
Edité le 07/09/2011 à 17:13

Rebonjour, j’ai du nouveau j’ai trouver comment extraire un nombre 240 par exemple de

				<ResourceNumber>240</ResourceNumber>

avec

@echo on
:chemin
set "chemin1='dir "Z:\source\" /b /s /-c /a:-d-s-h'"
set "chemin2="Z:\source\data\design\buildings\industry\businessservice\b_office30_t2.class""
:fichier
for /f "delims=" %%i in (%chemin2%) do (call :fichierencours %%i)
:fichierencours
set disque=%~d1&
set chemin3=%~p1&
set chemin4=%chemin3:~8%
set chemin5="Z:\destination X2\%chemin4%%nom%%extension%"
set nom=%~n1&
set extension=%~x1
set chemin6=%disque%%chemin3%%nom%%extension%
set Rep1="Z:\destination X2\%chemin4%"
set Rep1md=md %Rep1%
set Repchaine2md=md "%tmp%\Cities XL chaine2\%chemin4%"
set Repchaine2="%tmp%\Cities XL chaine2\%chemin4%%nom%%extension%"
:variable
set "variable1=[0-9]*"
set "chaine1=<ResourceNumber>%variable1%</ResourceNumber>"
for /f "delims=" %%a in ('findstr "%chaine1%" %1') do (%%a
%Rep1md%
%Repchaine2md%
(echo set "nombre1=%%a")>%Repchaine2%
call "Z:\CMD3 filtre.CMD")

et le fichier “Z:\CMD3 filtre.CMD” le voici

:filtre1
set "filtre1=([	]+)"
"C:\Windows\System32\switch.exe" %Repchaine2% "%filtre1%" ""
:filtre2
set "filtre2=<ResourceNumber>"
"C:\Windows\System32\switch.exe" %Repchaine2% "%filtre2%" ""
:filtre3
set "filtre3=</ResourceNumber>"
"C:\Windows\System32\switch.exe" %Repchaine2% "%filtre3%" ""

mais ce que je ne sais pas faire c’est comment appeller une variable set qui ce trouve depuis un fichier quelqu’un à une idée pour ça?
Edité le 11/09/2011 à 14:44

tu peux réexpliquer en français ?

Edité le 10/02/2012 à 14:21

tu la passes en argument, et dans le fichier appelé tu la récupères par %1

Tu a un exemple de ligne parce que là je vois pas du tout comment faire j’ai beau chercher sur internet mais je trouve rien du tout pour n’aider disons que le fichier nombre.cmd à le code suivant

set "nombre1=500"

comment le récuperer dans le fichier Calcul.cmd

set /a calcul=%nombre1%*5

en argument je ni arrive pas à le faire et je trouve pas de vrai exemple pour le faire correctement.
Edité le 11/09/2011 à 15:02

Un exemple de ce que je veux dire :

dans le programme appelant :
set “nombre1=500”
call ProgrammeAppele %nombre1%

dans le programme appelé :
echo la valeur passée est %1

Reste à savoir si j’ai bien compris ce que tu veux faire (à confirmer) :

Non c’est plutôt l’inverse que je veut faire set “nombre1=500” est la variable dans le programme à appeler c’est donc %nombre1% qui se trouve dans un fichier, valeur de %nombre1% 500 ou autre, et dans le fichier principal il apelle la valeur %nombre1% qui se trouve dans l’autre fichier et qui peut être n’importe quel nombre décimal, j’ai mis 500 en exemple.

À et oui le fichier appeler avant qu’il sois appeler n’est bien sur pas ouvert n’est belle et bien fermer!
Edité le 11/09/2011 à 17:02

Pour récupérer cette valeur dans un fichier fermé, il faut que tu le fasses avec findstr à l’intérieur de ton programme appelé.
Après, une fois la ligne récupérée, tu isoles la partie intéressante et tu l’appliques à ton switch

Ce message n’était pas conforme aux règles d’utilisation du nouveau forum :

Edité le 10/02/2012 à 14:21

Edité le 10/02/2012 à 14:22

Avec uniquement ce dont tu disposes dans cmd, à part lire le fichier ligne par ligne, les compter au passage et faire un echo uniquement pour la ligne 70 je ne vois pas.
Ou alors tu utilises les commandes unix head et tail

Rebonour, pour répondre à ta question je suis sous Windows 7 et j’ai une autre question ayant presque fini le code je dis presque voici la question que j’ai également poser sur un autre forum en attend d’une réponde

[quote=MediaXPIntel sur un autre forum]Question pour la commande de code suivante

CMD.exe /V:ON /C "Z:\Rechercher et Remplacer_4_ligne_final.cmd"

et le fichier Z:\Rechercher et Remplacer_4_ligne_final.cmd c’est à dire

:resetcompteur1
set /A ligne=0
:ligne
FOR /F "tokens=* delims=" %%a IN ('TYPE %source%') DO (
%Rep1md%
set /A ligne=!ligne!+1
(if !ligne! NEQ %ligne3% if !ligne! NEQ %ligne3RHOT_0% echo %%a>>%destination%)
(if !ligne! EQU %ligne3% if !ligne! NEQ %ligne3RHOT_0% echo ^%nombre2filtrer%>>%destination%)
(if !ligne! NEQ %ligne3% if !ligne! EQU %ligne3RHOT_0% echo ^%nombre2filtrerRHOT_0%>>%destination%)
)

n’écrit plusieurs fois le même la même ligne aux lieux de 166 lignes j’ai 665 lignes par exemple (664 plus 1 ligne vierge). Une idée de la syntaxe correct à mettre et les variables %nombre2filtrer% et %nombre2filtrerRHOT_0% sont

				^<ResourceNumber^>20^</ResourceNumber^>

pour exemple, les

^

c’est pour les caractères spéciaux telle que < ou > .
Ma question donc comment avoir 166 lignes sur 166 lignes d’après cette idée là,

if !ligne! NEQ %ligne3% if !ligne! NEQ %ligne3RHOT_0% echo %%a>>%destination%

si !ligne! est différent de %ligne3% et de %ligne3RHOT_0% écrit la variable %%a c’est à dire toutes les autres lignes dans le fichier de destination et pareil pour les autres lignes et ce à écrit 1 seul fois pas plusieurs comme c’est le cas ici de mon batch, parce que la ça ne générer 665 lignes sur la destination sur 166 lignes sur la source original.
[/quote]