PerlIO в Windows PowerShell и CMD.exe
Очевидно, что у меня есть Perl-скрипт, который приводит к двум разным выходным файлам, в зависимости от того, запускаю ли я его под Windows PowerShell или cmd.exe. Сценарий можно найти в нижней части этого вопроса. Дескриптор файла открывается IO::File
Я верю, что PerlIO делает что-то плохое. Кажется как будто под cmd.exe
выбранная кодировка является гораздо более компактной (4,09 КБ) по сравнению с PowerShell, которая генерирует файл почти в два раза больше (8,19 КБ). Этот сценарий принимает сценарий оболочки и создает пакетный файл Windows. Похоже, что сгенерированный под cmd.exe
просто обычный ASCII (1 байт), в то время как другой выглядит как UTF-16 (первые два байта) FF FE
)
Может кто-нибудь проверить и объяснить, почему PerlIO работает в Windows Powershell иначе, чем cmd.exe? Кроме того, как я могу явно получить ASCII-магический файл PerlIO, используя IO::File
?
В настоящее время только файл, созданный с 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;
1 ответ
Я думаю, вы перенаправляете вывод своего Perl-скрипта в командный файл? (не слишком знаком с Perl)
Если это так, вы должны сделать:
perl script.pl | out-file -encoding ASCII script.bat