どうやら、私が持っている Perl スクリプトは、Windows PowerShell で実行するか、cmd.exe で実行するかに応じて、2 つの異なる出力ファイルになるようです。スクリプトは、この質問の下部にあります。ファイル ハンドルは で開かれますIO::File
。PerlIO がやっかいなことをしていると思います。選択されたエンコーディングの下でcmd.exe
は、ほぼ 2 倍のサイズ (8.19 KB) のファイルを生成する PowerShell と比較して、はるかにコンパクトなエンコーディング (4.09 KB) のように見えます。このスクリプトは、シェル スクリプトを使用して Windows バッチ ファイルを生成します。下で生成されたものcmd.exe
は通常の ASCII (1 バイト文字) のようですが、もう一方は UTF-16 (最初の 2 バイトFF FE
)のようです。
Windows Powershell での PerlIO の動作が cmd.exe と異なる理由を誰かが確認して説明できますか? また、を使用して ASCII-magic PerlIO ファイルハンドルを明示的に取得するにはどうすればよいIO::File
ですか?
現在、で生成されたファイルのみcmd.exe
が実行可能です。UTF-16 .bat
(エンコーディングだと思います) は、PowerShell でも cmd.exe でも実行できません。
ところで、MSWin32 には Perl 5.12.1 を使用しています。
#!/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;