=head1 NOM

pl2bat - enveloppe du code perl dans un fichier batch (.bat)

=head1 SYNOPSIS

B<pl2bat> B<-h>

B<pl2bat> [B<-w>] S<[B<-a> I<argstring>]> S<[B<-s> I<stripsuffix>]> [files]

B<pl2bat> [B<-w>] S<[B<-n> I<ntargs>]> S<[B<-o> I<otherargs>]> S<[B<-s> I<stripsuffix>]> [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<PATH> 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<pl2bat>.

=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 <infile
    C:> 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<pl2bat> [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<pl2bat>.

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<call> 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<CMD.EXE> sous Windows NT, si F<perl.exe> n'est
pas dans votre B<PATH>, 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<CMD.EXE> 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<pl2bat> implémente ceci en faisant un C<goto :endofperl> 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<pl2bat>, 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<DATA>.

Une approche est :

    .  #!perl
    .  while( <DATA> ) {
    .	  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<cmd.exe>
d'interpréter la ligne C<:endofperl> dans cette documentation.
Sinon F<pl2bat.bat> 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<fail.bat> 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<fail.bat> é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<S>.

Par défaut, le fichier batch compare la variable
d'environnement C<OS> 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<CMD.EXE> de Windows NT.
Les utilisateurs de 4DOS/NT devront mettre une ligne C<ParameterChar = *>
dans leur fichier d'initialisation, ou exécuter C<setdos /p *> 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<ntargs>

Arguments pour invoquer perl dans le fichier batch engendré quand
il est lancé sous Windows NT. Par défaut : C<S<'-x -S %0 %*'>>.

=item B<-o> I<otherargs>

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<S<'-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9'>>.

=item B<-a> I<argstring>

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<OS> pour déterminer depuis quel système d'exploitation il a été
lancé.

=item B<-s> I<stripsuffix>

Ô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</.plx?/>.

=item B<-w>

Si aucune ligne correspondant à C</^#!.*perl/> 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<Config>].
Avec l'option B<-w>, C<" -w"> est ajouté après la valeur de C<$Config{startperl}>.
Si une ligne correspondant à C</^#!.*perl/> 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<pl2bat>, 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</INCONVÉNIENTS>.

=head1 VOIR AUSSI

perl, perlwin32, runperl.bat

=head1 TRADUCTION EN FRANÇAIS

Jean-Louis Morel <jl_morel@bribes.org>

=cut


