显然,我有一个Perl脚本导致两个不同的输出文件,具体取决于我是在Windows PowerShell或cmd.exe下运行它。该脚本可以在这个问题的底部找到。使用IO::File
打开文件句柄,我相信PerlIO正在做一些棘手的事情。似乎在cmd.exe
下所选择的编码是更紧凑的编码(4.09 KB),而PowerShell生成的文件几乎是两倍大小(8.19 KB)。此脚本采用shell脚本并生成Windows批处理文件。似乎在cmd.exe
下生成的那个只是常规ASCII(1个字节字符),而另一个看起来是UTF-16(前两个字节FF FE
)
有人可以验证并解释为什么PerlIO在Windows Powershell下的工作方式与cmd.exe不同吗?另外,如何使用IO::File
?
目前,只有cmd.exe
生成的文件才可执行。 UTF-16 .bat
(我认为这是编码)不能由PowerShell或cmd.exe执行。
BTW,我们正在使用Perl 5.12.1 for MSWin32
#!/usr/bin/env perl
use strict;
use warnings;
use File::Spec;
use IO::File;
use IO::Dir;
use feature ':5.10';
my $bash_ftp_script = File::Spec->catfile( 'bin', 'dm-ftp-push' );
my $fh = IO::File->new( $bash_ftp_script, 'r' ) or die $!;
my @lines = grep $_ !~ /^#.*/, <$fh>;
my $file = join '', @lines;
$file =~ s/ \\\n/ /gm;
$file =~ tr/'\t/"/d;
$file =~ s/ +/ /g;
$file =~ s/\b"|"\b/"/g;
my @singleLnFile = grep /ncftp|echo/, split $/, $file;
s/\$PWD\///g for @singleLnFile;
my $dh = IO::Dir->new( '.' );
my @files = grep /\.pl$/, $dh->read;
say 'echo off';
say "perl $_" for @files;
say for @singleLnFile;
1;
答案 0 :(得分:4)
我认为您将perl脚本的输出重定向到批处理文件中? (不太熟悉Perl)
如果是这样,你必须这样做:
perl script.pl | out-file -encoding ASCII script.bat