Remplacer une ligne interprétée d'un fichier binaire batch/perl
Résolu
sylv_brl
Messages postés
22
Statut
Membre
-
sylv_brl Messages postés 22 Statut Membre -
sylv_brl Messages postés 22 Statut Membre -
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
Le but étant de passer de ce fichier MakeFile :
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 :
(**)
Donc dernière solution de Dal avec exécution d'un .bat :
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 :
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é) :
Mais il me répond par :
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.
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.
A voir également:
- Remplacer une ligne interprétée d'un fichier binaire batch/perl
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier batch - Guide
- Fichier rar - Guide
4 réponses
En fait je penses que c'est bon, j'ai juste perdu des lignes vides de présentation ^^ :
Plus qu'à tester dans le script...
@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...
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...
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) :
...
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...
...
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...