Remplacer une ligne interprétée d'un fichier binaire batch/perl [Résolu/Fermé]

Signaler
Messages postés
21
Date d'inscription
lundi 24 juin 2013
Statut
Membre
Dernière intervention
16 septembre 2013
-
Messages postés
21
Date d'inscription
lundi 24 juin 2013
Statut
Membre
Dernière intervention
16 septembre 2013
-
Bonjour,

Ce topic fait suite à celui-ci : https://forums.commentcamarche.net/forum/affich-28603624-reecrire-une-ligne-comportant-une-variable-path-avec-sed#p28636723

Mon problème actuel étant que je suis novice en programmation et que je dois remplacer une ligne dans un fichier par une autre ligne, avec un fichier de sortie temporaire donc MakeFile > MakefileTemp, voir les détails sur l'autre post. La solution actuelle au problème donnée au précédent topic fonctionne avec des fichiers .txt, mais je n'arrive pas à l'employer avec des fichiers "binaires" (fichiers sans extension sous windows 7, je présume que c'est bien ça). J'ai rechercher et je suis tombé sur ça https://forum.zebulon.fr/topic/144261-r%C3%A9solu-bacth-dos-et-fichier-binaire/ où il mentionne d'utiliser les fonctionnalités
'perl'
que mon script utilise déjà pour des processus de compilation (mais ce n'est pas moi qui a fait le script). Donc je cherches en solution en cmd windows et/ou perl du coup (mais pas forcément perl, c'est juste une idée, d'où le fait que ce post soit dans programmation générale).


Le but étant de passer de ce fichier MakeFile :

CXX      = g++
CFLAGS   = -Wall
CPPFLAGS = $(CFLAGS) -I/usr/local/include -L/usr/local/lib -Iinclude/

LIBRARIES= rabbitmq
LIBS     = $(addprefix -l,$(LIBRARIES))

LIBNAME  = amqpcpp
LIBFILE  = lib$(LIBNAME).a
...


A ce fichier-çi MakefileTemp avec réecriture de la 3ieme ligne par une autre comprenant une variable d'environnement %DEPS% interpétée donc lors de la réecriture :

CXX      = g++
CFLAGS   = -Wall
CPPFLAGS = $(CFLAGS) -IC:\Users\Sylvain\naali-3dlive\deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -LC:\Users\Sylvain\naali-3dlive\deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/

LIB...


(**)

Donc dernière solution de Dal avec exécution d'un .bat :

C:\>type filter.bat

@echo off
setlocal disableDelayedExpansion

set InputFile=Makefile
set OutputFile=MakefileTemp
set "_strFind=CPPFLAGS = $(CFLAGS) -I/usr/local/include -L/usr/local/lib -Iinclude/"

>"%OutputFile%" (
  for /f "usebackq delims=" %%A in ("%InputFile%") do (
    if "%%A" equ "%_strFind%" (echo CPPFLAGS = $(CFLAGS^) -I%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -L%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/) else (echo %%A)
  )
)


Actuellement j'essayes donc d'implémenter ça donc mon script, mais il ne modifie pas MakefileTemp, il ne fait que l'afficher dans la console à la place :

@echo off
    setlocal disableDelayedExpansion
    set "_strFind=CPPFLAGS = $(CFLAGS) -I/usr/local/include -L/usr/local/lib -Iinclude/"
    cp -f Makefile MakefileTemp
    for /f "usebackq delims=" %%A in (MakefileTemp) do ( 
      if "%%A" equ "%_strFind%" (echo CPPFLAGS = $(CFLAGS^) -I%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -L%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/) else (echo %%A)
      )  
    ) 


J'ai donc essayes juste ça, en une seule ligne, avec File = MakeFile ou MakefileTemp.txt déjà avec le même contenu (interprété) :

for /f "usebackq delims=" %%A in (File) do ( if "%%A" equ "%_strFind%" (echo CPPFLAGS = $(CFLAGS^) -I%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -L%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/) else (echo %%A))


Mais il me répond par :

%%A était inattendu.


Je suis donc en train de comprendre la syntaxe de 'for' sur http://www.hotline-pc.org/batch.htm à 'Décomposer une variable' mais je ne vois pas encore ce qui ne va pas...

(**) : Pour l'histoire de slashs/backslashs, 'include' semblant ne pas accepter ça, j'essayes de contourner aussi ce problème en même temps, mais ce n'est pas prioritaire et j'ai quelques idées.

4 réponses

Messages postés
21
Date d'inscription
lundi 24 juin 2013
Statut
Membre
Dernière intervention
16 septembre 2013

En fait je penses que c'est bon, j'ai juste perdu des lignes vides de présentation ^^ :

@echo off
setlocal disableDelayedExpansion
set "_strFind=CPPFLAGS = $(CFLAGS) -I/usr/local/include -L/usr/local/lib -Iinclude/"
cp -f Makefile MakefileTemp
(for /f "usebackq delims=" %a in (MakefileTemp) do ( if "%a" equ "%_strFind%" (echo CPPFLAGS = $(CFLAGS^) -I%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -I
include/ -L%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/) else (echo %a))) > MakefileTemp


Plus qu'à tester dans le script...
Messages postés
21
Date d'inscription
lundi 24 juin 2013
Statut
Membre
Dernière intervention
16 septembre 2013

Reste encore un problème d'interprétation de '%' de '%a' que j'exécute ce code dans mon script, donc j'utilise bien '%%a' comme donnée initialement dans la solution. MakeFile n'a plus de lignes vides mais n'a pas réécrit la troisième ligne...
Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 935
hello
dans un bat, uiliser %%a
for /f "usebackq delims=" %%a in ...
Messages postés
21
Date d'inscription
lundi 24 juin 2013
Statut
Membre
Dernière intervention
16 septembre 2013

Ok donc finalement je reste avec ce code implémenté dans le .bat de construction des dépendances du projet global (Realxtend). Ici %DEPS% est la variable contenant le chemin de construction des ces dépendances (dont Rabbitmq-c et amqpcpp) :

...
cd "%DEPS%\amqp\amqpcpp"
cecho {0D}Compiling AMQPCpp.{# #}{\n}
sed -i "35i #define bzero(b,len) (memset((b), '\0', (len)), (void) 0)" include\AMQPcpp.h

@echo off
setlocal disableDelayedExpansion
(for /f "usebackq delims=" %%a in (Makefile) do ( if "%%a" equ "CPPFLAGS = $(CFLAGS) -I/usr/local/include -L/usr/local/lib -Iinclude/" (echo CPPFLAGS = $(CFLAGS^) -I%DEPS:\=/%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/librabbitmq/ -I%DEPS:\=/%/amqp/amqpcpp/include -L%DEPS:\=/%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/build/librabbitmq/RelWithDebInfo/
) else (echo %%a))) >MakefileTemp


rm Makefile
mv MakefileTemp Makefile

make -j%NUMBER_OF_PROCESSORS%
...

Donc j'évite finalement d'utiliser des variables intermédiaires en plus d'utiliser '%%a' comme l'a spécifié dubcek, et là je n'ai plus de problème en traitant tout d'un coup, même si c'est un peu laid pour reconfigurer les chemins si besoin ensuite. Maintenant je dois comprendre des problèmes d'utilisation de .lib redirigeant vers une .dll avec préfixe '_imp_' mais c'est une autre histoire...