Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Langage
Langage Toutes vos questions sur les scripts Perl en général. Avant de poster, veuillez consulter les FAQs perl, les cours Perl, les critiques de livres et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Actualité déjà publiée
 
Outils de la discussion
Publicité
'
Vieux 07/01/2011, 12h06   #41
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
grillé par philou
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 13h05   #42
hornetbzz
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 481
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 481
Points : 719
Points : 719
Envoyer un message via Skype™ à hornetbzz
Merci pour l'explication convaincante.
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 16h52   #43
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
La FAQ Perl va subir quelques corrections (grammaire, orthographe, formulation de phrases, codes...). N'hésitez pas à nous en faire part de bogues à corriger. De plus, si vous souhaitez ou avez des idées de nouvelles questions dans la FAQ, dites le nous.

Merci d'avance !!
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 13h15   #44
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
Bonjour,

La FAQ a subi comme annoncé une mise à jour complète. Merci de donner vos avis et remarques.

Merci !
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 15h29   #45
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
Je cherche des volontaires pour mettre à nouveau à jour la FAQ Perl.
En effet, cela m'a pris quelques jours pour mettre la FAQ à jour, mais je souhaiterais que l'on puisse à nouveau la mettre à jour pour y rajouter dans certaines sections, les nouveautés issues de Perl 5.10, 5.12 et 5.14.
Comme vous avez dû le lire ici, ActiveState ne propose plus que les versions 5.12 et 5.14. il serait donc intéressant que notre FAQ soit à jour dans les possibilités que nous offrent ces nouvelles versions.

N'hésitez donc pas à vous proposer ou même faire pas de vos participations dans ce fil et je les rajouterais dans la FAQ.

Merci
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 00h15   #46
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
Quelques mises à jour et nouvelles questions ont été rajoutées dans la FAQ Perl en rapport avec Perl 5.10, 5.12. Vous trouverez des nouveaux opérateurs tels yada-yada, each pour les listes et quelques pragmas.

Si vous avez des rajouts, même par rapport à perl 5.14, n'hésitez pas.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 09h29   #47
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 633
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 633
Points : 3 079
Points : 3 079
Pour la rubrique 4.Perl avancé->Operateurs, il faudrait ajouter l'opérateur "smart matching" (~~, chercher "Smart" dans perldoc perlsyn).

Merci pour l'opérateur each sur les tableaux et yada-yada
__________________
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2012, 17h34   #48
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 633
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 633
Points : 3 079
Points : 3 079
[Q] Comment utiliser * sur la ligne de commande windows ?

[R]
L'invité de commande Windows se démarque des shells Unix par le fait que l'expansion des caractères génériques de fichier n'est pas fait pas l'invité de commande (le shell), mais doit être réalisé par le programme qui est appelé par la commande.

Or, par défaut, Perl ne réalise pas cette opération, qui n'est pas nécessaire pour les autres shell. Pour remédier à ce manque, il existe une astuce que voici :
Code :
1
2
3
4
5
6
7
8
9
10
        C:\> copy con c:\perl\lib\Wild.pm
        # Wild.pm - emulate shell @ARGV expansion on shells that don't
        use File::DosGlob;
        @ARGV = map {
                      my @g = File::DosGlob::glob($_) if /[*?]/;
                      @g ? @g : $_;
                    } @ARGV;
        1;
        ^Z
        C:\> set PERL5OPT=-MWild
On pourra (re)définir PERL5OPT au niveau du système de sorte que l'option soit active pour tous les invités de commande.

Cette astuce est tirée de cet article, au paragraphe Command-line Wildcard Expansion.
__________________
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 26/07/2012, 10h27   #49
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
Merci philou, après quelques modifications, voici ce que donnera ta Q/R.
Lieu dans la FAQ : divers
Question : Comment utiliser * sur la ligne de commande windows ?
Réponse :
Citation:
L'invite de commande Windows se démarque des shells Unix par le fait que l'expansion des caractères génériques de fichier n'est pas fait par l'invite de commande (le shell), mais doit être réalisé par le programme qui est appelé par la commande.

Or, par défaut, Perl ne réalise pas cette opération, qui n'est pas nécessaire pour les autres shell (Linux/Unix/Mac). Pour remédier à ce manque, il existe une astuce que voici :

Code :
1
2
3
4
5
6
7
8
9
10
        C:\> copy con C:\Perl\lib\Wild.pm
        # Wild.pm - emulate shell @ARGV expansion on shells that don't
        use File::DosGlob;
        @ARGV = map {
                      my @g = File::DosGlob::glob($_) if /[*?]/;
                      @g ? @g : $_;
                    } @ARGV;
        1;
        ^Z
        C:\> set PERL5OPT=-MWild
Explication de la commande DOS copy con

La commande COPY suivante permet de copier ce que vous entrez au clavier vers un fichier de sortie (C:\perl\lib\Wild.pm en espérant que Perl est bien installé dans le C:\).

Une fois que vous avez tapé la commande et appuyé sur ENTRÉE, le DOS copie dans C:\Perl\lib\Wild.pm toutes les données saisies.
Appuyez ensuite la combinaison de touches "CTRL"+"Z" pour marquer la fin du fichier. Le caractère CTRL+Z est symbolise à l’écran par "^Z". Vous pouvez également interrompre la commande COPY [CON] en appuyant sur la touche F6, qui génère le caractère CTRL+Z de fin de fichier symbolise à l’écran par "^Z". Ensuite, vous appuyez sur la touche "ENTRÉE".

À ce stade, le fichier est créé. Il permettra à Perl d'émuler le comportement attendu du caractère étoilé.
Afin que votre terminal DOS fasse appel au module Wild nouvellement créé, une variable d'environnement temporaire a été définie de la sorte : set PERL5OPT=-MWild. À chaque fois que perl sera appelé dans le terminal DOS en cours d'utilisation, l'option -MWild sera ajoutée.

On pourra (re)définir PERL5OPT au niveau du système de sorte que l'option soit active pour tous les invites de commande DOS.

Cette astuce est tirée de cet article, au paragraphe Command-line Wildcard Expansion.
Cela te convient ?
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2012, 11h54   #50
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 633
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 633
Points : 3 079
Points : 3 079
C'est proprement parfait
__________________
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2012, 15h28   #51
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
FAQ mise à jours !
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2012, 11h50   #52
grab76
Nouveau Membre du Club
 
Homme
Développeur Web
Inscription : août 2011
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 12
Points : 39
Points : 39
Par défaut Lister des fichiers et suppression si vieux d'un mois

Hello,

Voici un script permettant de lister des fichiers textes dans un répertoire.
De comparer leur dernière date de modification.
Si les dates sont vieilles au minimum d'un mois, les fichiers sont supprimés.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
 
    #! /usr/bin/perl
    use strict;
    use warnings;
    use POSIX 'strftime';
    use DateTime;
    use Data::Dumper;
 
    my (@infos,%hash,$date,@monthoffile);
 
    ## Affiche la date du jour au format YYYY-MM-DDJHH-MM-SS
    my $mydate = DateTime->now();
    my @month = split('-',$mydate);
 
    ##### Liste les fichiers ayant l'extension .txt
    my @list = glob("/dossier/sousdossier/*.txt");
 
    ### recupere le nombre de fichier
    my $numberoffile = scalar(@list);
 
    for (my $v = 0;$v<$numberoffile;$v++){
    @infos = stat($list[$v]); ### recupere les informations du fichier en seconde
    $date = strftime("%Y-%m-%d",localtime($infos[9])); #### format l'information du fichier
    @monthoffile = split('-',$date); #### recupere le mois de la date
    if($month[1] != $monthoffile[1]){ ### verifie si le mois de creation du fichier est different de celui en cours
    print $list[$v]."\n fichier supprime\n";
    unlink $list[$v]; ### supprime le fichier
    }
    }
grab76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2012, 11h55   #53
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
Merci, je vais le mettre en ligne.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2012, 12h09   #54
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
Mise à jour de la FAQ effectuée.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2012, 14h54   #55
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
Nouvelle question dans la FAQ : Comment supprimer les fichiers vieux de plus de X jours dans des répertoires ?
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2013, 09h33   #56
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
Nouvelle question dans la FAQ : Comment lire ou créer un fichier raccourci (.lnk) en Perl ?
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2013, 09h28   #57
dmganges
Membre confirmé
 
Avatar de dmganges
 
Homme Michel DUFOUR
Administrateur Unix / Oracle retraité
Inscription : septembre 2011
Messages : 209
Détails du profil
Informations personnelles :
Nom : Homme Michel DUFOUR
Âge : 60
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Administrateur Unix / Oracle retraité
Secteur : Service public

Informations forums :
Inscription : septembre 2011
Messages : 209
Points : 223
Points : 223
Bonjour,

[Q1] Comment récupérer en perl la valeur d'une clé dans le registre windows ?

[R] En utilisant le module Win32::TieRegistry

Je n'ai rien inventé, tout est là :
http://search.cpan.org/~adamk/Win32-...TieRegistry.pm
http://www.bribes.org/perl/docfr/win32tieregistry.html

A partir d'un exemple nous allons récupérer la position du fichier icône associé à un type de fichier ainsi que la comande pour lancer une application.

Ces deux informations sont contenues dans le registre (regedit) de Windows et sont connues sous les noms de :
- DefaultIcon pour l'icône
- command pour la ligne de commande

Dans le registre, les données sont organisées dans des HKEY.
HKEY signifiant "handle key" soit "poignée de clés" les données sont stockées dans des "ruches" qui sont des blocs, éventuellement chaînés, de 4096 caractères.

Ces HKEY sont au nombre de cinq, leurs noms sont explicites :
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_CURRENT_CONFIG

Les informations que nous recherchons sont dans HKEY_CLASSES_ROOT
Toutes autres informations peuvent être trouvées avec le module perl Win32::TieRegistry
Il suffit de connaître le chemin de l'information pour y accéder, c'est ce qui est bien souvent le moins évident !
Il est également possible de modifier, mettre à jour... le registre.
Faut-il préciser combien une sauvegarde du registre peut éviter d'avoir à tout réinstaller ?

Avant de nous perdre dans la forêt, à l'aide d'un exemple, voyons comment Windows gère les associations des fichiers icônes, avec les extensions des fichiers .mcl .exe RealPlayer.exe batfile ...etc. :
- Une application de gestion de messagerie écrite en perl se trouve dans C:\Mail
- Cette application peut produire deux types de fichiers :
-- des fichiers de notification qui auront l'extension .mail
-- des fichiers d'anomalie qui auront l'extension .ano

Nous prenons, sur le net ou ailleurs, deux icônes, un qui symbolise une enveloppe qui à pour nom enveloppe.ico, l'autre qui symbolise un avertissement, exclamation.ico que nous sauvegardons respectivement en Mail.ico et Warn.ico dans le répertoire C:Mail :
C:\Mail\Mail.ico (enveloppe.ico)
C:\Mail\Warn.ico (exclamation.ico)

Pour les fichier de notification :
1) Dans regedit à [HKEY_CLASSES_ROOT] ajoutons une clé: .mail et dans 'valeur chaine' de cette clé: "MAIL.mail"
2) toujours dans [HKEY_CLASSES_ROOT] ajoutons une autre clé: MAIL.mail (nb c'est la 'valeur' mise dans .mail) ici la valeur doit rester à "valeur non définie" ou bien mettre un libellé perso.
3) A l'intérieur de MAIL.mail, créons une clé: DefaultIcon attention la casse à de l'importance, et pour cette clé, la valeur est le path du fichier icône C:\Mail\Mail.ico

Pour les fichier d'anomalie :
1) Dans regedit à [HKEY_CLASSES_ROOT] ajoutons une clé: .ano et dans 'valeur chaine' de cette clé: "ANO.ano"
2) toujours dans [HKEY_CLASSES_ROOT] ajoutons une autre clé: ANO.ano (nb c'est la 'valeur' mise dans .ano) ici la valeur doit rester à "valeur non définie" ou bien mettre un libellé perso.
3) A l'intérieur de ANO.ano, créons une clé: DefaultIcon attention la casse à de l'importance, et pour cette clé, la valeur est le path du fichier icône C:\Mail\Warn.ico

A ces endroits le registre ressemble à :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
[HKEY_CLASSES_ROOT]
  |
  =------------------------------Nom--------------Type-------------Données
  |
  +--.mail-------------------(par défaut)--------REG_SZ----------MAIL.mail
  |    
  +--MAIL.mail---------------(par défaut)--------REG_SZ----------Rien ou ICONE pour appli MAIL
  |      |
  |      +---DefaultIcon-----(par défaut)--------REG_SZ----------C:\Mail\Mail.ico
  |
  =
  |           
  +--.ano--------------------(par défaut)--------REG_SZ----------ANO.ano
  |    
  +--ANO.ano-----------------(par défaut)--------REG_SZ----------Rien Info personnelle
  |      |
  |      +---DefaultIcon-----(par défaut)--------REG_SZ----------C:\Mail\Warn.ico
  |
Une fois cette manip terminée, il faut fermer la session de l'utilisateur puis la rouvrir afin que les modifications soient prises en compte.

A partir de cet instant tous les fichiers d'extension .mail auront pour icône Mail.ico , les .ano auront pour icône Warn.ico

A présent nous sommes campés pour recherchés nos valeurs, ou toutes autres, dans le registre, en utilisant le module Win32::TieRegistry (sauf erreur présent dans le core, à télécharger éventuellement).


Premier petit programme qui affiche les clés d'un niveau :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
 
# Declaration d'un hash
my %RegHash;
 
# Création du point d'entrée intermédiaire associé au hash %RegHash
use Win32::TieRegistry( TiedHash => \%RegHash );
 
# Affectation d'un point d'entrée au hash, qui renvoie en fait un hash
my $Key = $RegHash{"HKEY_CLASSES_ROOT\\mailto"};
 
# Edition des keys trouvées au niveau HKEY_CLASSES_ROOT\\mailto
foreach (keys %$Key) {
	print $_, "\n";
}
 
# Dans le cas où les paramètres de sécurités du PC interdisent l'accès au registre,
# Il faut faire un raccourci de cmd.exe ayant les droits adminitrateur
# et donc temporiser la fermeture de cmd.exe pour avoir le temps de lire
print "\n\n<CrtlC> pour sortir\n";
sleep (3600);
On peut voir sur l'image Reg_Faq_1.jpg la similitude

NB avec :
Code :
my $Key = $RegHash{"HKEY_CLASSES_ROOT"};
On aurait listé toutes les clés immédiatement sous HKEY_CLASSES_ROOT , plusieurs milliers !

NB : Si le programme ne revoie rien 2 cas :
- soit la clé HKEY_CLASSES_ROOT\\mailto n'exsiste pas
- soit il y a un problème au niveau des droits d'exécution

Dans le deuxième cas, trois façons de régler l'anomalie :
- 1 - Aller dans Panneau de configuration => paramètres du contrôle de compte d’utilisateur
Choisir "Ne jamais m'avertir" (pas recommandé !)

- 2 - Lancer l'ouverture d'une console DOS depuis le menu "Démarrer" avec "Exécuter en tant qu'administrateur", (un utilisateur non administrateur devra fournir le mot de passe), puis y lancer perl pgm.pl

- 3 - Créer un raccourci de la console DOS sur le bureau, avec pour paramètres :
--> Cible ==================> C:\Perl\bin\perl.exe C:\DevPerl\Registre/pgm.pl
--> Démarrer dans ==========> C:\DevPerl\Registre
--> Onglet Compatibilité
----> Niveau de privilège ==> Cocher "Exécuter ce programme en tant qu'administrateur"
Dans ce dernier cas, suivant le niveau d'avertissement choisi, il faudra éventuellement confirmer la demande de Windows.

ATTENTION à la sécurité, une personne malveillante peut modifier la source.pl et causer beaucoup de dégâts !
=========================================================================================


Les problèmes de droits d'accès réglés, voyons à présent comment accéder différemment au registre :

# Dans l'exemple qui suit :
# - on précise un délimiteur différent, Delimiter => '/' , qui évite de gérer les \\
# - Au lieu d'affecter un point d'entrée intermédiaire à un hash, on utilse la fonction ->open sur la HKEY à un
# niveau précisé : $Dossier->Open('mailto', { 'Delimiter' => '/' }); toujours en précisant le délimiteur '/'


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl -w
use strict;
use warnings;
use utf8;
use Win32::TieRegistry( Delimiter => '/' );
 
# 1 - assignation d'un HKEY à un dossier
my $Clef    = 'HKEY_CLASSES_ROOT';
my $Dossier = $Registry->{$Clef};
 
# 2 - ouverture du dossier
my $Sous_Dossier  = $Dossier->Open('mailto', { 'Delimiter' => '/' });
 
# 3 - lecture des clés dans le Sous_Sossier
print "\n\nClefs de $Dossier->Open\n\n";
my $idx = 0;
foreach my $key (keys %$Sous_Dossier) {
    printf "  %3d.  %25s\n", ++$idx, $key;
}
print "\n\n";
 
##
# sleep (3600);
# Dans l'exemple qui suit :
# On met le tout dans une fonction win32_reg_read qui prend en paramètre une sous-clé ainsi qu'une valeur de clé.
# Si celle-ci contient un dossier, on desecend d'un niveau, si elle = "" on affiche la valeur de la clé.
# Au passage on contrôle notre DefaultIcon de l'appli Mail, ainsi que la commande pour lancer le gestionnaire de # # # messagerie avec son DefaultIcon.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
 
sub win32_reg_read {
	my $sub_key = shift;
	my $value = shift;
	print "\n=========================\n";
	print "PRINT  $sub_key    $value\n\n";
 
	use Win32::TieRegistry ( Delimiter => '/' );
	my $HKEY_CLASSES_ROOT  = Win32::TieRegistry->new("HKEY_CLASSES_ROOT");
	if ($HKEY_CLASSES_ROOT) {
		print "\nOK HKEY  $HKEY_CLASSES_ROOT\n";	 
		my $skey = $HKEY_CLASSES_ROOT->Open($sub_key, { 'Delimiter' => '/' });
		if ($skey) {
			print "OK SUBKEY $sub_key\n";
			my %key_values = $skey->GetValue($value);
			foreach (sort keys %key_values) {
				print "EACH $_\n";
			}
		}
	}
}
 
# Recherche DefaultIcon & command
 
win32_reg_read("mailto/DefaultIcon","" );
 
win32_reg_read("mailto/shell/open/command","" );
 
win32_reg_read("MAIL.mail/DefaultIcon","" );
 
win32_reg_read("ANO.ano","DefaultIcon" );
 
##
#sleep (3600);
# Enfin, dans le même ordre d'idée :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/usr/bin/perl -w
use strict;
use warnings;
use Win32::TieRegistry( Delimiter => '/' );
 
# 1 - Assigne une ruche à Hkey
my $Hkey  = 'HKEY_CLASSES_ROOT';
my $Ruche = ();
$Ruche = $Registry->{$Hkey};
print "\n\n\nRuche $Hkey   = $Ruche\n";
 
my @SubKeys = qw / mailto MAIL.mail ManyCam.Effect migfile .mcl anifile ANO.ano batfile brmFile /;
 
foreach my $SubKey ( sort @SubKeys ) {
	# 2 - Ouvre une sous-clé dans la ruche $SubKey
	print "\n\n=======================================\n";
	print "SubKey = $SubKey\n";
 
	my $Chemin = ();
	$Chemin  = $Ruche->Open($SubKey, { 'Delimiter' => '/' });
	if ( $Chemin ) {
		print "$Ruche OUVERTE ! \n\tChemin de recherhe = $Chemin\n\n";
	} else {
		print "Impossible d'ouvrir $Ruche avec SubKey = $SubKey\n\n";
		next;
	}
 
	# 3 - Affiche les Clefs triées du Chemin
	my $idx = 0;
	my $ValeurClef = ();
	foreach my $Clef (sort keys %$Chemin) {
		$Clef =~ s/\///;
		$ValeurClef = $Chemin->GetValue($Clef);
		if ( $ValeurClef ) {
			printf "CLEF  %3d. %20s   GetValue = %20s\n", ++$idx, $Clef, $ValeurClef;
		}
	}
 
	# 4 - Affiche la valeur pour DefaultIcon
	my $DefaultIcon = "DefaultIcon";
	my $SubSubKey = $SubKey .'/'. $DefaultIcon;
	$Chemin  = $Ruche->Open($SubSubKey, { 'Delimiter' => '/' });
	if ( ! $Chemin ) {
		print "Impossible d'ouvrir $Ruche avec SubSubKey = $SubSubKey\n\n";
		next;
	}
	foreach my $Clef (sort keys %$Chemin) {
		$Clef =~ s/\///;
		$ValeurClef = $Chemin->GetValue($Clef);
		if ( $ValeurClef ) {
			printf "\nCLEF  %3d. %28s  GetValue = %20s\n", ++$idx, $SubSubKey, $ValeurClef;
		}
	}
 
	# 5 - Affiche la valeur pour command
	my $command = "shell/open/command";
	$SubSubKey = $SubKey .'/'. $command;
	$Chemin  = $Ruche->Open($SubSubKey, { 'Delimiter' => '/' });
	if ( ! $Chemin ) {
		print "Impossible d'ouvrir $Ruche avec SubSubKey = $SubSubKey\n\n";
		next;
	}
	foreach my $Clef (sort keys %$Chemin) {
		$Clef =~ s/\///;
		$ValeurClef = $Chemin->GetValue($Clef);
		if ( $ValeurClef ) {
			printf "\nCLEF  %3d. %28s  GetValue = %20s\n", ++$idx, $SubSubKey, $ValeurClef;
		}
	}	
	print "\n\n";
}
##
# sleep (3600);
Le mieux serait bien sûr un parcours récursif, comme pour les répertoires, sachant que lorsque un get->subkey échoue on se trouve sur une valeur de clé.


Je me suis évidemment largement inspiré de bouts de code trouvés sur Internet, dont je n'ai pas noté toutes les URL.

Les seuls problèmes que j'ai rencontré, sont au niveau des droits d'accès au registre.

Pour finir, il existe plusieurs façons de désigner une icône associée à des fichiers exécutables ou non :

1 - Celle que nous avons utilisé pour l'appli Mail en créant nous même les clés dans le registre DefaultIcon = C:\Mail\Mail.ico

2 - Lorsque DefaultIcon à pour valeur un .dll suivi d'un nombre, dans ce cas l'icône est dans la .dll désigné, comme dans : DefaultIcon = %SystemRoot%\System32\imageres.dll,-68
C'est le cas le plus fréquent !
Dans ce cas, il faut extraire l'icône de la dll.
Je n'ai pas encore fait d'extraction, ce doit être possible en utilisant les informations suivantes :
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
http://search.cpan.org/~bulkdd/Win32-API-0.75/API.pm
plus quelques info pour accéder à l'API :
http://www.developpez.net/forums/d99...e/#post5572583

3 - Lorsque DefaultIcon à pour valeur un .exe ,éventuellement suivi d'un chiffre, dans ce cas il s'agit de l'icône associé à l'exécutable, le chiffre désigne le numéro s'il y en a plusieurs d'associés, comme dans : DefaultIcon = C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe,0

4 - DefaultIcon désigne un fichier dont le chemin est en partie en hexadécimal, comme pour Perl : C:\Windows\Installer\{4552F143-9C76-44A0-8F68-B6E022668375}\_95fe01f856ebc8574541b8763179eadc,0
Je ne sais pas ce que représente le fichier de plus de 300Mo _95fe01f856ebc8574541b8763179eadc

Il peut y avoir d'autres méthodes d'association !!!

Le souci avec le registre c'est de savoir ce qu'on cherche, et une fois qu'on la trouvé, savoir comment l'interprêter !

@djibril :
Mes sources méritent certainement l'intervention d'un pro perl.
C'est le premier jet de ma première participation, s'il manque des précisions, si la présentation est à revoir... n'hésite pas à me renvoyer le tout avec tes commentaires, je corrigerai.
MERCI à toutes et à tous.
[Edit 12:53]
J'avais oublié le nom de clé [DefaultIcon]
Images attachées
Type de fichier : jpg Reg_Faq_1.jpg (304,9 Ko, 4 affichages)
dmganges est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2013, 15h10   #58
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
Nouvelle question : Comment lister les répertoires de façon récursive ou non ?
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2013, 15h10   #59
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
@dmganges Je vais me pencher sur ta proposition.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2013, 10h40   #60
dmganges
Membre confirmé
 
Avatar de dmganges
 
Homme Michel DUFOUR
Administrateur Unix / Oracle retraité
Inscription : septembre 2011
Messages : 209
Détails du profil
Informations personnelles :
Nom : Homme Michel DUFOUR
Âge : 60
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Administrateur Unix / Oracle retraité
Secteur : Service public

Informations forums :
Inscription : septembre 2011
Messages : 209
Points : 223
Points : 223
Par défaut Notification de courrier

Bonjour djibril,
Comme promis mais avec du retard... voici quelques modules qui me sont utiles...
Je n'ai pas trouvé le moyen de les joindre en MP.
Bien cordialement,
MD

[EDIT Oubli de LISEZMOI.txt]
[EDIT oubli de Reg_Ano_Mail.reg] Décidément !
Pour modifier le registre afin de prendre en compte les icônes Warn.ico et Mail.ico et avoir une visualisation de Mail et d'Ano sur le bureau.
Il faut au minimum fermer la session et la rouvrir pour la prise en compte.

Il semble que le forum n'accepte pas les .reg en pièces jointes, je colle le contenu ici :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Windows Registry Editor Version 5.00
 
[HKEY_CLASSES_ROOT\.ano]
@="ANO.ano"
 
[HKEY_CLASSES_ROOT\ANO.ano]
 
[HKEY_CLASSES_ROOT\ANO.ano\DefaultIcon]
@="C:\\Mail\\Warn.ico"
 
[HKEY_CLASSES_ROOT\.mail]
@="MAIL.mail"
 
[HKEY_CLASSES_ROOT\MAIL.mail]
 
[HKEY_CLASSES_ROOT\MAIL.mail\DefaultIcon]
@="C:\\Mail\\Mail.ico"
PS: Vérifier au préalable que ces HKEY ne soient pas déjà utilisées, modifier leurs noms le cas échéant.
Fichiers attachés
Type de fichier : zip Mail.zip (582,3 Ko, 1 affichages)
Type de fichier : txt LISEZMOI.txt (3,3 Ko, 1 affichages)
dmganges est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Actualité déjà publiée
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h53.


 
 
 
 
Partenaires

Hébergement Web