1 eval 'exec perl -x -S "$0" ${1+"$@"}'
2 if 0; # In case running under some shell
12 or: $0 [-w] [-u] [-a argstring] [-s stripsuffix] [files]
13 or: $0 [-w] [-u] [-n ntargs] [-o otherargs] [-s stripsuffix] [files]
14 -n ntargs arguments to invoke perl with in generated file
15 when run from Windows NT. Defaults to
17 -o otherargs arguments to invoke perl with in generated file
18 other than when run from Windows NT. Defaults
19 to '-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9'.
20 -a argstring arguments to invoke perl with in generated file
21 ignoring operating system (for compatibility
22 with previous pl2bat versions).
23 -u update files that may have already been processed
24 by (some version of) pl2bat.
25 -w include "-w" on the /^#!.*perl/ line (unless
26 a /^#!.*perl/ line was already present).
27 -s stripsuffix strip this suffix from file before appending ".bat"
29 Can be a regex if it begins with `/'
30 Defaults to "/\.plx?/"
35 warn($usage), exit(0) if !getopts('whun:o:a:s:',\%OPT) or $OPT{'h'};
36 # NOTE: %0 is already enclosed in doublequotes by cmd.exe, as appropriate
37 $OPT{'n'} = '-x -S %0 %*' unless exists $OPT{'n'};
38 $OPT{'o'} = '-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9' unless exists $OPT{'o'};
39 $OPT{'s'} = '/\\.plx?/' unless exists $OPT{'s'};
40 $OPT{'s'} = ($OPT{'s'} =~ m#^/([^/]*[^/\$]|)\$?/?$# ? $1 : "\Q$OPT{'s'}\E");
43 if( defined( $OPT{'a'} ) ) {
55 if "%OS%" == "Windows_NT" goto WinNT
60 if NOT "%COMSPEC%" == "%SystemRoot%\\system32\\cmd.exe" goto endofperl
61 if %errorlevel% == 9009 echo You do not have Perl in your PATH.
62 if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
68 my $headlines = 2 + ($head =~ tr/\n/\n/);
69 my $tail = "\n__END__\n:endofperl\n";
71 @ARGV = ('-') unless @ARGV;
85 my $start= $Config{startperl};
86 $start= "#!perl" unless $start =~ /^#!.*perl/;
87 open( FILE, $file ) or die "$0: Can't open $file: $!";
89 foreach $line ( @file ) {
91 if ( $line =~ /^:endofperl\b/ ) {
92 if( ! exists $OPT{'u'} ) {
93 warn "$0: $file has already been converted to a batch file!\n";
98 if ( not $linedone and $line =~ /^#!.*perl/ ) {
99 if( exists $OPT{'u'} ) {
100 $skiplines = $linenum - 1;
101 $line .= "#line ".(1+$headlines)."\n";
103 $line .= "#line ".($linenum+$headlines)."\n";
107 if ( $line =~ /^#\s*line\b/ and $linenum == 2 + $skiplines ) {
112 $file =~ s/$OPT{'s'}$//oi;
113 $file .= '.bat' unless $file =~ /\.bat$/i or $file =~ /^-$/;
114 open( FILE, ">$file" ) or die "Can't open $file: $!";
116 print FILE $start, ( $OPT{'w'} ? " -w" : "" ),
117 "\n#line ", ($headlines+1), "\n" unless $linedone;
118 print FILE @file[$skiplines..$#file];
119 print FILE $tail unless $taildone;
126 pl2bat - wrap perl code into a batch file
132 B<pl2bat> [B<-w>] S<[B<-a> I<argstring>]> S<[B<-s> I<stripsuffix>]> [files]
134 B<pl2bat> [B<-w>] S<[B<-n> I<ntargs>]> S<[B<-o> I<otherargs>]> S<[B<-s> I<stripsuffix>]> [files]
138 This utility converts a perl script into a batch file that can be
139 executed on DOS-like operating systems. This is intended to allow
140 you to use a Perl script like regular programs and batch files where
141 you just enter the name of the script [probably minus the extension]
142 plus any command-line arguments and the script is found in your B<PATH>
147 There are several alternatives to this method of running a Perl script.
148 They each have disadvantages that help you understand the motivation
155 C:> perl x:/path/to/script.pl [args]
159 C:> perl -S script.pl [args]
163 C:> perl -S script [args]
167 C:> ftype Perl=perl.exe "%1" %*
174 C:> ftype Perl=perl.exe "%1" %*
176 C:> set PathExt=%PathExt%;.PL
182 B<1> and B<2> are the most basic invocation methods that should work on
183 any system [DOS-like or not]. They require extra typing and require
184 that the script user know that the script is written in Perl. This
185 is a pain when you have lots of scripts, some written in Perl and some
186 not. It can be quite difficult to keep track of which scripts need to
187 be run through Perl and which do not. Even worse, scripts often get
188 rewritten from simple batch files into more powerful Perl scripts in
189 which case these methods would require all existing users of the scripts
192 B<3> works on modern Win32 versions of Perl. It allows the user to
193 omit the ".pl" or ".bat" file extension, which is a minor improvement.
195 B<4> and B<5> work on some Win32 operating systems with some command
196 shells. One major disadvantage with both is that you can't use them
197 in pipelines nor with file redirection. For example, none of the
198 following will work properly if you used method B<4> or B<5>:
200 C:> script.pl <infile
201 C:> script.pl >outfile
202 C:> echo y | script.pl
205 This is due to a Win32 bug which Perl has no control over. This bug
206 is the major motivation for B<pl2bat> [which was originally written
207 for DOS] being used on Win32 systems.
209 Note also that B<5> works on a smaller range of combinations of Win32
210 systems and command shells while B<4> requires that the user know
211 that the script is a Perl script [because the ".pl" extension must
212 be entered]. This makes it hard to standardize on either of these
217 There are several potential traps you should be aware of when you
220 The generated batch file is initially processed as a batch file each
221 time it is run. This means that, to use it from within another batch
222 file you should preceed it with C<call> or else the calling batch
223 file will not run any commands after the script:
227 Except under Windows NT, if you specify more than 9 arguments to
228 the generated batch file then the 10th and subsequent arguments
229 are silently ignored.
231 Except when using F<CMD.EXE> under Windows NT, if F<perl.exe> is not
232 in your B<PATH>, then trying to run the script will give you a generic
233 "Command not found"-type of error message that will probably make you
234 think that the script itself is not in your B<PATH>. When using
235 F<CMD.EXE> under Windows NT, the generic error message is followed by
236 "You do not have Perl in your PATH", to make this clearer.
238 On most DOS-like operating systems, the only way to exit a batch file
239 is to "fall off the end" of the file. B<pl2bat> implements this by
240 doing C<goto :endofperl> and adding C<__END__> and C<:endofperl> as
241 the last two lines of the generated batch file. This means:
245 =item No line of your script should start with a colon.
247 In particular, for this version of B<pl2bat>, C<:endofperl>,
248 C<:WinNT>, and C<:script_failed_so_exit_with_non_zero_val> should not
251 =item Care must be taken when using C<__END__> and the C<DATA> file handle.
257 . last if /^__END__$/;
266 The dots in the first column are only there to prevent F<cmd.exe> to interpret
267 the C<:endofperl> line in this documentation. Otherwise F<pl2bat.bat> itself
268 wouldn't work. See the previous item. :-)
270 =item The batch file always "succeeds"
272 The following commands illustrate the problem:
274 C:> echo exit(99); >fail.pl
276 C:> perl -e "print system('perl fail.pl')"
278 C:> perl -e "print system('fail.bat')"
281 So F<fail.bat> always reports that it completed successfully. Actually,
282 under Windows NT, we have:
284 C:> perl -e "print system('fail.bat')"
287 So, for Windows NT, F<fail.bat> fails when the Perl script fails, but
288 the return code is always C<1>, not the return code from the Perl script.
294 By default, the ".pl" suffix will be stripped before adding a ".bat" suffix
295 to the supplied file names. This can be controlled with the C<-s> option.
297 The default behavior is to have the batch file compare the C<OS>
298 environment variable against C<"Windows_NT">. If they match, it
299 uses the C<%*> construct to refer to all the command line arguments
300 that were given to it, so you'll need to make sure that works on your
301 variant of the command shell. It is known to work in the F<CMD.EXE> shell
302 under Windows NT. 4DOS/NT users will want to put a C<ParameterChar = *>
303 line in their initialization file, or execute C<setdos /p*> in
304 the shell startup file.
306 On Windows95 and other platforms a nine-argument limit is imposed
307 on command-line arguments given to the generated batch file, since
308 they may not support C<%*> in batch files.
310 These can be overridden using the C<-n> and C<-o> options or the
311 deprecated C<-a> option.
317 =item B<-n> I<ntargs>
319 Arguments to invoke perl with in generated batch file when run from
320 Windows NT (or Windows 98, probably). Defaults to S<'-x -S %0 %*'>.
322 =item B<-o> I<otherargs>
324 Arguments to invoke perl with in generated batch file except when
325 run from Windows NT (ie. when run from DOS, Windows 3.1, or Windows 95).
326 Defaults to S<'-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9'>.
328 =item B<-a> I<argstring>
330 Arguments to invoke perl with in generated batch file. Specifying
331 B<-a> prevents the batch file from checking the C<OS> environment
332 variable to determine which operating system it is being run from.
334 =item B<-s> I<stripsuffix>
336 Strip a suffix string from file name before appending a ".bat"
337 suffix. The suffix is not case-sensitive. It can be a regex if
338 it begins with `/' (the trailing '/' is optional and a trailing
339 C<$> is always assumed). Defaults to C</.plx?/>.
343 If no line matching C</^#!.*perl/> is found in the script, then such
344 a line is inserted just after the new preamble. The exact line
345 depends on C<$Config{startperl}> [see L<Config>]. With the B<-w>
346 option, C<" -w"> is added after the value of C<$Config{startperl}>.
347 If a line matching C</^#!.*perl/> already exists in the script,
348 then it is not changed and the B<-w> option is ignored.
352 If the script appears to have already been processed by B<pl2bat>,
353 then the script is skipped and not processed unless B<-u> was
354 specified. If B<-u> is specified, the existing preamble is replaced.
358 Show command line usage.
364 C:\> pl2bat foo.pl bar.PM
365 [..creates foo.bat, bar.PM.bat..]
367 C:\> pl2bat -s "/\.pl|\.pm/" foo.pl bar.PM
368 [..creates foo.bat, bar.bat..]
370 C:\> pl2bat < somefile > another.bat
372 C:\> pl2bat > another.bat
373 print scalar reverse "rekcah lrep rehtona tsuj\n";
375 [..another.bat is now a certified japh application..]
379 [..updates the wrapping of some previously wrapped scripts..]
381 C:\> pl2bat -u -s .bat *.bat
382 [..same as previous example except more dangerous..]
386 C<$0> will contain the full name, including the ".bat" suffix
387 when the generated batch file runs. If you don't like this,
388 see runperl.bat for an alternative way to invoke perl scripts.
390 Default behavior is to invoke Perl with the B<-S> flag, so Perl will
391 search the B<PATH> to find the script. This may have undesirable
394 On really old versions of Win32 Perl, you can't run the script
397 C:> script.bat [args]
403 A loop should be used to build up the argument list when not on
404 Windows NT so more than 9 arguments can be processed.
406 See also L</Disadvantages>.
410 perl, perlwin32, runperl.bat