@ARGV пуст в ActivePerl в Windows 7 - PullRequest
9 голосов
/ 20 ноября 2010

У меня есть следующий скрипт Perl.Я пытаюсь запустить его в Windows 7, используя ActivePerl:

#!c:\Perl64\bin\perl.exe -w

use strict;

my $mp3splt_exe = 'c:\Program Files (x86)\mp3splt\mp3splt.exe';

my $mp3splt_args = '-o "@n @f" -g "r%[@o @N]"  -f -t 6.0';

print @ARGV;
my $filename = $ARGV[0];

print "$mp3splt_exe $mp3splt_args $filename\n";

(как вы можете видеть, я пытаюсь создать оболочку для mp3splt :-))

Когда я запускаю егокак это:

C: \ Program Files (x86) \ mp3splt> run_mp3splt.pl a

Я получаю это:

Use of uninitialized value $filename in concatenation (.) or string at C:\Program Files (x86)\mp3splt\run_mp3splt.pl line 12.
c:\Program Files (x86)\mp3splt\mp3splt.exe -o "@n @f" -g "r%[@o @N]"  -f -t 6.0

ИтакВо-первых, когда я print @ARGV, ничего не печатается, и, во-вторых, когда я присваиваю $filename = $ARGV[0], $filename равно undef, поэтому я получаю предупреждение.

Итак ... Что я делаю неправильно?Почему параметр командной строки не передается в сценарий?

Ответы [ 4 ]

32 голосов
/ 14 сентября 2011

Как уже отмечали другие, perl blah.pl asdf работает, а blah.pl asdf не работает.Это происходит потому, что когда вы запускаете скрипт perl напрямую, Windows понимает, что он должен вызвать perl, и использует правило perl "%1", которое передает только имя скрипта в perl, а не какой-либо из параметров.

Чтобы исправить это , вы должны указать Windows использовать правило perl "%1" %*

Как это сделать может быть немного утомительно:

Опция 1

Согласно perlmonks , вы должны иметь возможность использовать assoc и ftype в командной строке.Фактически, если вы наберете help ftype, он скажет вам, как настроить perl:

assoc .pl=PerlScript
ftype PerlScript=perl.exe %1 %*

Для запуска assoc требуется команда cmd от имени administrator в Windows 7.

Однако это не сработало для меня.Windows проигнорировала ассоциацию.Я должен был изменить реестр.Это может быть связано с неправильным советом по запуску утилиты Default Programs в Win 7, которая позволяет вам указать программу, которая будет использоваться для заданных расширений файлов. В отличие от XP , это не позволит вам указать несколько командных опций (для использования в контекстном меню) - только позволит вамукажите программу, которая используется при двойном щелчке файла (или при запуске foo.pl из командной строки).

Параметр 2

Изменение реестра: HKEY_CLASSES_ROOT

Если вы использовали команды assoc / ftype, у вас могут быть записи для perl или PerlScript.Как я уже говорил ранее, они будут игнорироваться.Найдите pl_auto_file и просмотрите до command:

HKCR\pl_auto_file\shell\open\command

Здесь (Default) должно быть установлено примерно так: "C:\Perl\bin\perl.exe" "%1"

Добавьте отсутствующее %* в конце этого, и вы должны быть готовы пойти: "C:\Perl\bin\perl.exe" "%1" %*

перезагрузка не требуется.

Вариант 3

Если вы 'ленивый и доверчивый, вы можете попробовать использовать это как reg-файл и импортировать его в свой реестр:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\pl_auto_file\shell\open\command]
@="\"C:\\Perl\\bin\\perl.exe\" \"%1\" %*"

Этого должно быть достаточно, чтобы blah.pl asdf заработало.

7 голосов
/ 11 октября 2012

У меня была проблема, что если я выполнял на Win7:

perl myprog.pl a b c  

, программа получала параметры (в @ARGV) правильно, но если я выполнял:

myprog.pl a b c 

программа НЕ получит параметры.

Я искал в Интернете решение и вскоре обнаружил, что это не проблема Perl ActiveState, а скорее проблема ассоциации типов файлов в Windows (Win7) (благодаря PerlMonksвеб-сайт).

Однако все решения, меняющие

assoc .pl=Perl  

и

ftype Perl="C:\Perl\bin\perl.exe" "%1" %* 

, не решили для меня загадки.Я заметил, что assoc .pl каким-то образом не использовался, потому что, если я добавил assoc .plx = Perl и переименовал мою программу в myprog.plx

myprog.plx a b c 

, он работал отлично!

Итак, я прочитал эту проблему на форуме Microsoft, где упоминалась «функция» Win7 «Программы по умолчанию», и я нашел решение своей проблемы:

Откройте «Программы по умолчанию», нажав кнопку «Пуск»,и затем нажмите «Программы по умолчанию».

Выберите «Связать тип файла или протокол с программой», выберите «.pl» и нажмите «Изменить программу».Уже был интерпретатор командной строки Perl, указанный как «Рекомендуемые программы», но вместо этого я нажал «Обзор» и сам выбрал Perl.exe.После закрытия экрана «Связать тип файла ...»,

myprog.pl a b c 

, выполненного как чудо, все параметры были правильно получены моей программой.

Надеюсь, это поможет ...

2 голосов
/ 16 февраля 2014

Решение проблемы с Perl ARGV в Windows 8.1:

HKEY_CLASSES_ROOT \ Applications \ perl.exe \ shell \ open \ command = "C: \ Perl \ bin \ perl.exe" "% 1"% *

Перезагрузка не требуется.

0 голосов
/ 20 ноября 2010

Я почти уверен, что Windows 7 не понимает линию Шебанга. Что произойдет, если вы запустите это с perl run_mp3splt.pl a?

...