=head1 NOM pl2bat - enveloppe du code perl dans un fichier batch (.bat) =head1 SYNOPSIS B B<-h> B [B<-w>] S<[B<-a> I]> S<[B<-s> I]> [files] B [B<-w>] S<[B<-n> I]> S<[B<-o> I]> S<[B<-s> I]> [files] =head1 DESCRIPTION Cet utilitaire convertit un script perl en un fichier batch qui peut être exécuté sur les systèmes d'exploitation compatible DOS. Il a été conçu pour vous permettre d'utiliser un script Perl comme les programmes courants et les fichiers batch où vous entrez le nom du script [probablement sans l'extension] suivi des arguments de la ligne de commande : le script est trouvé dans votre B et est lancé. =head2 AVANTAGES Il y a plusieurs alternatives à cette méthode de lancer un script Perl. Elles ont chacune des inconvénients qui vous aideront à comprendre la raison d'utiliser B. =over =item 1 C:> perl x:/path/to/script.pl [args] =item 2 C:> perl -S script.pl [args] =item 3 C:> perl -S script [args] =item 4 C:> ftype Perl=perl.exe "%1" %* C:> assoc .pl=Perl then C:> script.pl [args] =item 5 C:> ftype Perl=perl.exe "%1" %* C:> assoc .pl=Perl C:> set PathExt=%PathExt%;.PL then C:> script [args] =back B<1> et B<2> sont les méthodes d'invocation les plus basiques qui devraient fonctionner sur tout système [compatible DOS ou non]. Ils demandent plus de frappes au clavier et exigent de l'utilisateur qu'il sache que le script est écrit en Perl. C'est pénible quand vous avez beaucoup de scripts dont certains sont écrits en Perl et d'autres non. Il peut être tout à fait difficile de se souvenir quels sont les scripts qui ont besoin d'être lancés avec Perl et lesquels n'en ont pas besoin. Même pire, les scripts sont souvent des réécritures de simples fichiers batch en des scripts Perl plus puissants, auxquels cas ces méthodes exigeraient que tous les utilisateurs soient tenu au courant. B<3> marche sur les versions Win32 modernes de Perl. Cette méthode permet à l'utilisateur d'omettre l'extension de fichier " .pl " ou " .bat ", ce qui est une amélioration mineure. B<4> et B<5> fonctionnent sur quelques systèmes d'exploitation Win32 avec quelques shells de commande. Un inconvénient majeur avec les deux est que vous ne pouvez les utiliser ni avec les pipes ni avec les redirections de fichier. Par exemple, aucune des commandes suivantes ne fonctionnera correctement si vous utilisez la méthode B<4> ou B<5>: C:> script.pl script.pl >outfile C:> echo y | script.pl C:> script.pl | more Ceci est dû à un bug de Win32 sur lequel Perl n'a aucun contrôle. Ce bug est la motivation majeure pour B [lequel a été écrit pour DOS à l'origine] d'être utilisé sur les systèmes Win32. Notez aussi que B<5> marche sur une plus petite gamme de combinaisons de systems Win32 et commandes du shell alors que B<4> exige que l'utilisateur sache que le script est un script Perl [parce que l'extension " .pl " doit être entrée]. Cela rend difficile de rendre standard l'un ou l'autre de ces méthodes. =head2 INCONVÉNIENTS Il y a plusieurs pièges potentiels dont vous devez être conscient quand vous utilisez B. Le fichier batch engendré est traité comme un fichier batch à chaque fois qu'il est exécuté. Cela signifie que, pour l'utiliser dans un autre fichier batch, vous devez le faire précédé de C car sinon le fichier batch appelant ne lancera aucune commande placé après le script. call script [args] Excepté sous Windows NT, si vous spécifiez plus de 9 arguments au fichier batch produit, alors le 10e argument et les suivants seront ignorés silencieusement. Sauf si vous utilisez F sous Windows NT, si F n'est pas dans votre B, alors le lancement du script vous donnera un message d'erreur du type "Commande ou nom de fichier incorrect" qui vous fera sans doute penser que le script n'est pas dans votre PATH. Quand on utilise F sous Windows NT, le message d'erreur générique est suivi de "You do not have Perl in your PATH", pour rendre ceci plus clair. Sur la plupart des systèmes d'exploitation compatibles DOS, la seule manière de sortir d'un fichier batch est de "sauter à la fin" du fichier. B implémente ceci en faisant un C et en ajoutant C<__END__> et C<:endofperl> à la fin du fichier batch engendré. Ce qui signifie que : =over =item Aucune ligne de votre script ne doit commencer par deux points ":". En particulier, pour cette version de B, C<:endofperl>, C<:WinNT>, et C<:script_failed_so_exit_with_non_zero_val> ne doivent pas être utilisés. =item Des précautions doivent être prises dans l'utilisation de C<__END__> et du descripteur de fichier C. Une approche est : . #!perl . while( ) { . last if /^__END__$/; . [...] . } . __END__ . lignes de données . à traiter . __END__ . :endofperl Les points dans la première colonne ne sont là seulement que pour empêcher F d'interpréter la ligne C<:endofperl> dans cette documentation. Sinon F ne fonctionnerait pas. Voyez l'article précédent. :-) =item Le fichier batch "réussit" toujours. Les commandes suivantes illustrent le problème : C:> echo exit(99); >fail.pl C:> pl2bat fail.pl C:> perl -e "print system('perl fail.pl')" 99 C:> perl -e "print system('fail.bat')" 0 Donc F répond toujours qu'il s'est exécuté avec succès. Remarquons que nous avons sous Windows NT : C:> perl -e "print system('fail.bat')" 1 Donc, pour Windows NT, F échoue quand le script Perl échoue, mais le code de retour est toujours C<1> et non le code de retour du script Perl. =back =head2 FONCTION Par défaut, le suffixe ".pl" sera ôté avant d'ajouter un suffixe ".bat" aux noms de fichiers fournis. Ceci peut être contrôlé avec l'option C. Par défaut, le fichier batch compare la variable d'environnement C avec C<"Windows_NT">. Si il y a coïncidence, il utilise la construction C<%*> pour faire référence à tous les arguments de la ligne de commande qui lui ont été passés, donc ayez soin de vérifier que cela fonctionne sur votre variante du shell de commande. On sait que cela fonctionne avec le shell F de Windows NT. Les utilisateurs de 4DOS/NT devront mettre une ligne C dans leur fichier d'initialisation, ou exécuter C dans le fichier d'amorçage du shell. Sur Windows95 et les autres plateforms, une limite de neuf arguments est imposées aux arguments de ligne de commande passés au fichier batch engendré puisqu'ils n'acceptent pas C<%*> dans les fichiers batch. Ceci peut être changé en utilisant les options C<-n> et C<-o> ou l'option dépréciée C<-a>. =head1 OPTIONS =over 8 =item B<-n> I Arguments pour invoquer perl dans le fichier batch engendré quand il est lancé sous Windows NT. Par défaut : C>. =item B<-o> I Arguments pour invoquer perl dans le fichier batch engendré quand il est lancé sous un autre système que Windows NT (c-à-d lancé sous DOS, Windows 3.1, ou Windows 95). Par défaut : C>. =item B<-a> I Arguments pour invoquer perl dans le fichier batch engendré. Spécifier B<-a> empêche le fichier batch de tester la variable d'environnement C pour déterminer depuis quel système d'exploitation il a été lancé. =item B<-s> I Ôte une chaîne suffixe du nom de fichier avant d'ajouter un suffixe ".bat". Le suffixe n'est pas sensible à la casse. Il peut être une expression rationnelle s'il commence par `/' (le dernier `/' est optionnel et un C<$> final est toujours sous-entendu). Par défaut : C. =item B<-w> Si aucune ligne correspondant à C n'est trouvé dans le script, une telle ligne est insérée juste après le nouveau préambule. La ligne exacte dépend de C<$Config{startperl}> [voir L]. Avec l'option B<-w>, C<" -w"> est ajouté après la valeur de C<$Config{startperl}>. Si une ligne correspondant à C existe déjà dans le script alors elle n'est pas changée et l'option B<-w> est ignorée. =item B<-u> Si le script apparaît comme ayant été déjà traité par B, alors le script est sauté et non traité à moins que B<-u> ne soit spécifié. Si B<-u> est spécifié, le préambule existant est remplacé. =item B<-h> Affiche l'utilisation de la ligne de commande (aide) =back =head1 EXEMPLES C:\> pl2bat foo.pl bar.PM [..crée foo.bat, bar.PM.bat..] C:\> pl2bat -s "/\.pl|\.pm/" foo.pl bar.PM [..crée foo.bat, bar.bat..] C:\> pl2bat < somefile > another.bat C:\> pl2bat > another.bat print scalar reverse "rekcah lrep rehtona tsuj\n"; ^Z [..another.bat est maintenant une application certifiée japh..] C:\> ren *.bat *.pl C:\> pl2bat -u *.pl [..met à jour l'enveloppe d'un script précédemment enveloppé avec pl2bat..] C:\> pl2bat -u -s .bat *.bat [..identique à l'exemple précédent, mais plus dangereux..] =head1 BUGS C<$0> contient le nom complet, le suffixe ".bat" compris, quand le fichier batch engendré tourne. Si vous n'aimez pas ça, voyez runperl.bat pour une autre manière d'invoquer un script perl. Le comportement par défaut est d'invoquer Perl avec l'option B<-S>, donc Perl cherchera dans PATH pour trouver le script. Ceci peut avoir des effets indésirables. Sur de vraiment vieille version de Perl Win32, vous ne pouvez pas lancer le script via C:> script.bat [args] et vous devez utiliser C:> script [args] Une boucle devrait être utilisée pour construire la liste d'arguments quand on n'est pas sous Windows NT de manière que plus de 9 arguments puissent être pris en compte. Voir aussi L. =head1 VOIR AUSSI perl, perlwin32, runperl.bat =head1 TRADUCTION EN FRANÇAIS Jean-Louis Morel =cut