pl2bat - enveloppe du code perl dans un fichier batch |
pl2bat - enveloppe du code perl dans un fichier batch (.bat)
pl2bat -h
pl2bat [-w] [-a argstring] [-s stripsuffix] [files]
pl2bat [-w] [-n ntargs] [-o otherargs] [-s stripsuffix] [files]
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 PATH et est lancé.
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 pl2bat.
C:> perl x:/path/to/script.pl [args]
C:> perl -S script.pl [args]
C:> perl -S script [args]
C:> ftype Perl=perl.exe "%1" %* C:> assoc .pl=Perl then C:> script.pl [args]
C:> ftype Perl=perl.exe "%1" %* C:> assoc .pl=Perl C:> set PathExt=%PathExt%;.PL then C:> script [args]
1 et 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.
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.
4 et 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 4 ou 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 pl2bat [lequel a été écrit pour DOS à l'origine] d'être utilisé sur les systèmes Win32.
Notez aussi que 5 marche sur une plus petite gamme de combinaisons de systems Win32 et commandes du shell alors que 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.
Il y a plusieurs pièges potentiels dont vous devez être conscient quand vous utilisez 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 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 CMD.EXE sous Windows NT, si perl.exe n'est pas dans votre 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 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. pl2bat implémente ceci en faisant un goto :endofperl
et en
ajoutant __END__
et :endofperl
à la fin du fichier batch engendré.
Ce qui signifie que :
:endofperl
,
:WinNT
, et :script_failed_so_exit_with_non_zero_val
ne doivent
pas être utilisés.
__END__
et
du descripteur de fichier DATA
.. #!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 cmd.exe
d'interpréter la ligne :endofperl
dans cette documentation.
Sinon pl2bat.bat ne fonctionnerait pas. Voyez l'article précédent. :-)
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 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, fail.bat échoue quand le script Perl échoue, mais
le code de retour est toujours 1
et non le code de retour du script Perl.
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 S
.
Par défaut, le fichier batch compare la variable
d'environnement OS
avec "Windows_NT"
. Si il y a coïncidence, il utilise
la construction %*
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 CMD.EXE de Windows NT.
Les utilisateurs de 4DOS/NT devront mettre une ligne ParameterChar = *
dans leur fichier d'initialisation, ou exécuter 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 %*
dans les fichiers batch.
Ceci peut être changé en utilisant les options -n
et -o
ou l'option dépréciée -a
.
'-x -S %0 %*'
.
'-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9'
.
OS
pour déterminer depuis quel système d'exploitation il a été
lancé.
$
final est toujours
sous-entendu). Par défaut : /.plx?/
.
/^#!.*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 $Config{startperl}
[voir Config].
Avec l'option -w, " -w"
est ajouté après la valeur de $Config{startperl}
.
Si une ligne correspondant à /^#!.*perl/
existe déjà dans le script alors
elle n'est pas changée et l'option -w est ignorée.
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..]
$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 -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 INCONVÉNIENTS.
perl, perlwin32, runperl.bat
Jean-Louis Morel <jl_morel@bribes.org>
pl2bat - enveloppe du code perl dans un fichier batch |