2009-10-24 2 views
2

Windows Vista Ultimate 64 비트에서 파일 이름 내에서 crc32 값을 확인하는 RapidCRC의 기능을 에뮬레이트하려고합니다. 그러나, 나는 어떤 종류의 논쟁의 한계에 부딪치고있는 것처럼 보입니다. Perl 스크립트 및 Windows의 SendTo에 20 개 이상의 파일을 사용할 수없는 이유는 무엇입니까?

내가 빠른 펄 스크립트를 작성 호출하는 배치 파일을 만든 다음, 나는 약 20 파일 이하를 선택하면이 위대한 작품을 %APPDATA%\Microsoft\Windows\SendTo

에 배치 파일에 바로 가기를 배치, "마우스 오른쪽 버튼으로 클릭하고 보내기 "내 배치 파일 스크립트. 그러나 그 이상을 선택하면 아무런 변화가 없습니다. 나는 어떤 인물이나 논쟁의 여지가 어느 정도 있다고 생각합니다.

바라건대 나는 단순한 뭔가 빠졌고 솔루션이나 해결 방법이 너무 고통스럽지 않기를 바랍니다.

참고 :

배치 파일 (crc32_inline.bat) :

crc32_inline.pl %* 

펄 노트 :

내가 사용 (딸기) 펄 v5.10.0

내 경로에 crc32.bat가있는 C : \ strawberry \ perl \ bin이 있습니다.

펄 스크립트 (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 파일 연결이 실행 가능하게되기를 바랬다. 불행히도, 나는 틀렸고 send-to 메뉴에 나타나지 않았다. 배치 파일에 스크립트를 배치하는 것은 주목할만한 입력 제한과 함께 작동합니다 (최소한 메뉴에 표시됨). 나중에 Windows 단축키가 심볼릭 링크보다 명령과 비슷하다는 것을 기억할 때까지는 아니 었습니다. 감사! – vlee

+0

Rob Kennedy :'cmd.exe'의 줄 길이 제한은 약 8190 자입니다. 'CreateProcess'를 전달할 수있는 최대 길이는 32767 자입니다. 정확히 무엇을 요구하는지주의하십시오. http://blogs.msdn.com/oldnewthing/archive/2003/12/10/56028.aspx – Joey

관련 문제