显然,我有一个Perl脚本的结果在两个不同的输出文件,这取决于我是否在Windows PowerShell或cmd.exe下运行它。 脚本可以在这个问题的底部find。 文件句柄用IO::File打开,我相信PerlIO正在做一些棘手的事情。 看起来好像在cmd.exe下select的编码是更紧凑的编码(4.09 KB),相比PowerShell生成的文件几乎两倍的大小(8.19 KB)。 该脚本需要一个shell脚本并生成一个Windowsbatch file。 看起来像在cmd.exe下生成的只是常规的ASCII(1字节字符),而另一个似乎是UTF-16(前两个字节FF FE )
有人可以validation并解释为什么PerlIO在Windows Powershell下的工作方式与cmd.exe不同? 另外,如何使用IO::File显式获取ASCII-magic PerlIO文件句柄?
目前,只有使用cmd.exe生成的文件是可执行的。 UTF-16 .bat (我认为是编码)不能由PowerShell或cmd.exe执行。
顺便说一句,我们使用Perl 5.12.1 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;
我认为你是重定向到一个批处理文件的perl脚本的输出? (不太熟悉Perl)
如果是这样你必须这样做:
perl script.pl | out-file -encoding ASCII script.bat