Я пытаюсь эмулировать способность 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>;
Выполнение команды непосредственно из меню «Отправить» также зависит от длины командной строки. –
Я изменил ярлыки, чтобы вызвать «perl» ", который, похоже, работает. Создание пакетных файлов было глупым недосмотром с моей стороны. Я изначально создавал ярлыки для самих скриптов perl, надеясь, что ассоциация файлов perl сделает их исполняемыми. К сожалению, я ошибался, и они не отображались в меню отправки. Обертка скрипта в пакетном файле, казалось, работала (по крайней мере, она появилась в меню) с заметным ограничением ввода. Только после этого я вспомнил, что ярлык Windows больше похож на команду, чем символическую ссылку. Благодаря! –
vlee
Rob Kennedy: 'cmd.exe' имеет ограничение длины строки около 8190 символов. Максимальная длина, которую вы можете передать 'CreateProcess', составляет 32767 символов. Будьте осторожны, что именно вы просите: http://blogs.msdn.com/oldnewthing/archive/2003/12/10/56028.aspx – Joey