PerlスクリプトとWindowsのSendToで20を超えるファイルを使用できないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/1618899

質問

Windows Vista Ultimateでファイル名内のcrc32値をチェックする RapidCRC の機能をエミュレートしようとしています。 64ビット。ただし、何らかの引数の制限に直面しているようです。

簡単なPerlスクリプトを作成し、それを呼び出すバッチファイルを作成し、%APPDATA%\ Microsoft \ Windows \ SendTo

にバッチファイルへのショートカットを配置しました

これは、約20個以下のファイルを選択し、右クリックして「送信先」を選択した場合に最適です。バッチファイルスクリプト。ただし、それ以上を選択しても何も起こりません。どこかに文字や引数の制限があると思う。

願わくば、私は単純なものを見逃しており、解決策や回避策がそれほど苦痛ではないことを願っています。

参照:

バッチファイル(crc32_inline.bat):

crc32_inline.pl %*

Perlのメモ:

  

(strawberry)perl v5.10.0を使用しています

     

crc32.batが存在するパスにC:\ strawberry \ perl \ binがあります。

perlスクリプト(crc32_inline.pl):

#!/usr/bin/env perl

use strict;
use warnings;

use Cwd;
use English qw( -no_match_vars );
use File::Basename;

$OUTPUT_AUTOFLUSH = 1;

my $crc32_cmd = 'crc32.bat';
my $failure_report_basename = 'crc32_failures.txt';
my %failures = ();

print "\n";
foreach my $arg (@ARGV) {

  # if the file has a crc, check to see if it matches the calculated
  # crc.
  if (-f $arg and $arg =~ /\[([0-9a-f]{8})\]/i) {
    my $crc = uc $1;
    my $basename = basename($arg);
    print "checking ${basename}... ";
    my $calculated_crc = uc `${crc32_cmd} "${arg}"`;
    chomp($calculated_crc);
    if ($crc eq $calculated_crc) {
      print "passed.\n";
    }
    else {
      print "FAILED (calculated ${calculated_crc})\n";
      my $dirname = dirname($arg);
      $failures{$dirname}{$basename} = $calculated_crc;
    }
  }
}

print "\nReport Summary:\n";
if (scalar keys %failures == 0) {
  print "  All files OK\n";
}
else {
  print sprintf("  %d / %d files failed crc32 validation.\n" .
                "  See %s for details.\n",
                scalar keys %failures,
                scalar @ARGV,
                $failure_report_basename);

  my $failure_report_fullname = $failure_report_basename;
  if (defined -f $ARGV[0]) {
    $failure_report_fullname
      = dirname($ARGV[0]) . '/' . $failure_report_basename;
  }

  $OUTPUT_AUTOFLUSH = 0;
  open my $fh, '>' . $failure_report_fullname or die $!;
  foreach my $dirname (sort keys %failures) {
    print {$fh} $dirname . "\n";
    foreach my $basename (sort keys %{$failures{$dirname}}) {
      print {$fh} sprintf("  crc32(%s) basename(%s)\n",
                          $failures{$dirname}{$basename},
                          $basename);
    }
  }
  close $fh;
  $OUTPUT_AUTOFLUSH = 1;
}

print sprintf("\n%s done! (%d seconds elapsed)\n" .
              "Press enter to exit.\n",
              basename(<*>),
              time() - $BASETIME);
<STDIN>;
役に立ちましたか?

解決

「送信先」にスクリプトへのショートカットを置くことをお勧めします。バッチファイル経由で実行する代わりに、ディレクトリ( cmd.exe のコマンドラインの長さの制限が適用されます)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top