2009-10-24 3 views
2

Я пытаюсь эмулировать способность RapidCRC проверить значения crc32 в именах файлов в Windows Vista Ultimate 64-бит. Однако, похоже, я сталкиваюсь с каким-то ограничением аргументов.Почему я не могу использовать более 20 файлов со своим скриптом Perl и Windows SendTo?

Я написал небольшой скрипт на Perl, создан пакетный файл, чтобы назвать его, затем помещается ярлык для пакетного файла в %APPDATA%\Microsoft\Windows\SendTo

Это прекрасно работает, когда я выбираю около 20 файлов или меньше, щелкните правой кнопкой мыши и " отправьте «мой сценарий пакетного файла». Тем не менее, ничего не происходит, когда я выбираю больше, чем это. Я подозреваю, что символ или количество аргументов где-то ограничены.

Надеюсь, что мне не хватает чего-то простого и что решение или обходное решение не слишком болезненны.

Ссылки:

пакетный файл (crc32_inline.bat):

crc32_inline.pl %* 

Perl отмечает:

Я использую (клубника) Perl v5.10.0

У меня есть C: \ strawberry \ perl \ bin на моем пути, в котором существует crc32.bat.

Перл (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($0), 
       time() - $BASETIME); 
<STDIN>; 

ответ

1

Я рекомендую просто положить ярлык на скрипт в «Отправить» каталог вместо делать это с помощью пакетного файла (который подлежит до cmd.exe s ограничения на длину командной строки).

+1

Выполнение команды непосредственно из меню «Отправить» также зависит от длины командной строки. –

+0

Я изменил ярлыки, чтобы вызвать «perl» ", который, похоже, работает. Создание пакетных файлов было глупым недосмотром с моей стороны. Я изначально создавал ярлыки для самих скриптов perl, надеясь, что ассоциация файлов perl сделает их исполняемыми. К сожалению, я ошибался, и они не отображались в меню отправки. Обертка скрипта в пакетном файле, казалось, работала (по крайней мере, она появилась в меню) с заметным ограничением ввода. Только после этого я вспомнил, что ярлык Windows больше похож на команду, чем символическую ссылку. Благодаря! – vlee

+0

Rob Kennedy: 'cmd.exe' имеет ограничение длины строки около 8190 символов. Максимальная длина, которую вы можете передать 'CreateProcess', составляет 32767 символов. Будьте осторожны, что именно вы просите: http://blogs.msdn.com/oldnewthing/archive/2003/12/10/56028.aspx – Joey