> Tous les forums > Forum Windows 7
 Demande d'aide pour un script batch DOS
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
ribotb
  Posté le 15/09/2013 @ 11:54 
Aller en bas de la page 
Petit astucien

Bonjour,

Le batch se compose de deux commandes :

- un reg query pour récupérer dans un fichier toutes les clés "Uninstall" de la base de registres,

- une commande FOR pour traiter ce fichier et créer un autre fichier contenant une partie des informations : dans le fichier issu du reg query j'ai des groupes de la forme :

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{FCB10DE3-E190-4A7E-B06A-FAC61567ABFC}
AuthorizedCDFPrefix REG_SZ
Comments REG_SZ
Contact REG_SZ
DisplayVersion REG_SZ 5.0.17
[...]
Language REG_DWORD 0x409
DisplayName REG_SZ MySQL Tools for 5.0

Et dans le fichier de sortie, pour chaque groupe, je voudrais obtenir une ligne de la forme :

{FCB10DE3-E190-4A7E-B06A-FAC61567ABFC} MySQL Tools for 5.0

C'est-à-dire : nom_de_la_clé valeur_de_DisplayName.

Voici le batch :

@echo off
If Exist %Temp%\DisplayName.txt ERASE %Temp%\DisplayName.txt
If Exist %Temp%\UninstallKeys.txt ERASE %Temp%\UninstallKeys.txt
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" > %Temp%\UninstallKeys.txt /s
FOR /F "eol=; tokens=1,3* delims= " %%A in (%Temp%\UninstallKeys.txt) do (
echo 1: %%A 3: %%B 3*: %%C
IF "%%A:~1,4"=="HKEY" set $UninstallKey=%%A:~71
If "%%A"=="DisplayName" (set $DisplayName=%%C
echo %$UninstallKey% %$DisplayName% >> %Temp%\DisplayName.txt
)

Le problème c'est que je ne récupère rien dans les variables $UninstallKey et ùDisplayName !

Et ce que je comprends encore moins c'est que j'ai un autre batch qui ressemble un peu à celui-ci (il récupère la valeur de InstallLocation pour une clé Uninstall particulière) et qui fonctionne :

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\DocFetcher" > %Temp%\DocFetcherInstallLocation.txt
FOR /F "tokens=1-5 delims= " %%A in (%Temp%\DocFetcherInstallLocation.txt) do (
If "%%A"=="InstallLocation" set $DocFetcherInstallLocation=%%C %%D %%E
)

Merci de votre aide.

Bernard

Publicité
olivier2013
 Posté le 15/09/2013 à 16:42 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Salut,

essaie dans le script qui marche avec "%%A:~1"=="InstallLocation" pour voir si cela ne vient pas de ça.

A+

Constance
 Posté le 15/09/2013 à 16:48 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Yo .o/

Je pense que le /s dans la commande reg query devrait être avant la redirection.

Edit : Ha ben nan, j'ai rien dit, ça n'a pas l'air d'avoir d'influence... m'enfin ce serait quand même plus propre pour la relecture, je pense :hmm:



Modifié par Constance le 15/09/2013 16:50
olivier2013
 Posté le 15/09/2013 à 16:58 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Si passe pas essaie avec ça

"%%A:~1%%"=="InstallLocation" pour voir si cela ne vient pas de ça.

A+

Constance
 Posté le 15/09/2013 à 17:47 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bon, sinon j'ai une autre solution, excepté qu'elle nécessite que l'exécutable externe sed et ses dépendances soient accessibles par le PATH sur la machine exécutant le script : voir ici.

ribotb
 Posté le 17/09/2013 à 15:06 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Bonjour, Je viens de m'apercevoir tout à fait par hasard qu'il y avait des réponses. Je n'ai pas eu de mails d'alerte. Je lis tout ça et je reviens vous voir. Bernard
ribotb
 Posté le 17/09/2013 à 17:52 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

essaie dans le script qui marche avec "%%A:~1"=="InstallLocation"

Eh ben, y marche plus

Si passe pas essaie avec ça

"%%A:~1%%"=="InstallLocation"

Pas mieux comme ça...

Mais il semble qu'on ait une piste : le découpage du paramètre remplacable de la commande FOR (en l'occurrence %%A) pose problème.

@Constance : J'ai jeté un coup d'oeil au script. À première vue ça ressemble à ce que je veux faire. S'il s'avère que je ne peux pas découper ma variable %%A je me plongerais dans cet exemple. Il faut que je vois de plus près comment s'installe et s'utilise l'instruction sed.

Bernard

ribotb
 Posté le 17/09/2013 à 19:52 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Constance a écrit :

Bon, sinon j'ai une autre solution, excepté qu'elle nécessite que l'exécutable externe sed et ses dépendances soient accessibles par le PATH sur la machine exécutant le script : voir ici.

J'ai récupéré le script.

J'ai récupéré sed.exe (je l'ai mis dan le même dossier que le script, je verrai après les tests pour lui trouver un emplacement définitif, et si nécessaire le déclarer dans la variable PATH).

Je n'ai pas utilisé les dépendances, apparemment sed.exe fonctionne sans (enfin... pour le script qui nous intéresse).

J'ai lancé le script tel quel, sans changer une virgule.

Malgré une flopée de messages d'erreur (notamment à chaque REG QUERY), bizarrement le script fonctionne, sauf un petit truc ... : alors que le fichier liste.tmp se présente bien, le fichier final (après suppression de la chaîne HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\ sur chaque ligne du fichier tmp) n'a plus de sauts de ligne (un petit truc à voir dans le sed).

J'envoie des captures par "plis séparés", mon message était trop gros !

Bernard

ribotb
 Posté le 17/09/2013 à 19:57 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Les messages d'erreur :

et plus loin :


Publicité
ribotb
 Posté le 17/09/2013 à 19:59 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Le fichier final (début) :

Ce srait bien mieux comme ça :

Le fichier tmp :

Bernard

Constance
 Posté le 17/09/2013 à 20:21 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Re ^^

Hmm ben chez moi il donne un listing final correct du point de vue des sauts de ligne, c'est peut-être justement parce que tu n'as pas pris les dépendances que ça merdouille ?

Ceci dit j'ai moi aussi pas mal de messages d'erreur... je vais y jeter un œil.

Edit : je pense que ligne 11 il vaudrait mieux encadrer %%a avec des guillemets dans la commande REG QUERY (pour éviter le coup de la syntaxe incorrecte).
Les autres messages d'erreur sont liés au fait qu'il n'y a pas systématiquement de valeur DisplayName associée à une de ces clefs.



Modifié par Constance le 17/09/2013 20:27
ribotb
 Posté le 17/09/2013 à 23:25 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

J'ai récupéré les dépendances ici (fichier sed-4.2.1-dep.zip qui contient libint3.dll, regex2.dll et libconv2.dll) mais l'anomalie demeure dans le fichier final.

J'ai aussi encadré la variable %%a comme tu le suggérais et ça a effectivement éliminé les problèmes de syntaxe. Il reste juste les messages causés par l'absence de la sous-clé DisplayName (une vongtaine) :

Bernard

ribotb
 Posté le 18/09/2013 à 13:26 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Pour être certain que sed.exe et ses dépendances étaient correctement installés j'ai téléchargé et exécuté le package d'installation sed-4.2.1-setup.exe mais le résultat final est identique.

Bernard

ribotb
 Posté le 18/09/2013 à 15:48 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Constance a écrit :

Hmm ben chez moi il donne un listing final correct du point de vue des sauts de ligne, c'est peut-être justement parce que tu n'as pas pris les dépendances que ça merdouille ?

J'ai remplacé l'instruction :

TYPE "%temp%\liste.tmp" | sed s/.*\\Uninstall\\// > %Sortie%

par :

FOR /F "delims=\ tokens=7*" %%c in (%temp%\liste.tmp) do (
echo %%c >> %Sortie%
)

C'est moins élégant mais ça fonctionne.

Il y a un cas qui n'est pas prévu par le script, c'est quand le type de DisplayName est REG_EXPAND_SZ. Ca donne ça :

{7299052b-02a4-4627-81f2-1818da5d550d} Microsoft Visual C++ 2005 Redistributable
{79D5997E-BF79-48BB-8B41-9BE59C15C2D7} DisplayName REG_EXPAND_SZ OmniPage SE 2.0
{7F95A744-78DA-4AED-A8F0-A0AF330B8411}_is1 Video to Video

C'est le seul cas sur 293 clés ! On se demande pourquoi ScanSoft a fait comme ça ! Je ne sais pas si on peut prévoir ça dans le sed qui recherche REG_SZ ? Comme c'est un cas unique j'ai rectifié à la mano.

En tout cas, merci infiniment pour ton script.

Bernard

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Sujets relatifs
AIde pour realiser Un batch de deplacement conditionnel de fichier
Aide à l'ecriture d'un fichier batch ou script de deplacement de fichier.
Demande d'aide pour créer une partition en +
Rapports pour aide à l'optimisation
Java et java script pour Windows 7
Réintallation Windows 7 - Aide pour résoudre un problème
Aide pour rapport Whocrashed suite nombreux Bluescreen
[RAID1] Demande d'aide sur ma configuration
Aide pour fichier .bat
Besoin d'aide pour un diagnostic panne
Plus de sujets relatifs à Demande d''aide pour un script batch DOS
 > Tous les forums > Forum Windows 7