PerlIO в Windows PowerShell и CMD.exe

По-видимому, Perl script У меня есть два разных выходных файла в зависимости от того, запускаю ли я его под Windows PowerShell или cmd.exe. script можно найти в нижней части этого вопроса. Дескриптор файла открывается с помощью IO::File, я считаю, что PerlIO делает некоторые отвратительные вещи. Кажется, что при cmd.exe выбранная кодировка является гораздо более компактной кодировкой (4.09 KB) по сравнению с PowerShell, которая генерирует файл почти в два раза больше (8.19 КБ). Этот script принимает оболочку script и создает пакетный файл 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 script в пакетный файл? (не слишком знакомы с Perl)

Если это вам нужно сделать:

perl script.pl | out-file -encoding ASCII script.bat