2010-11-20 2 views
9

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

#!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

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

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, поэтому я получаю предупреждение.

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

+0

Право это действительно странно, потому что я просто побежал сниппет на мой ящик Win7 и он действительно работал. Какую версию perl вы используете, и установили ли вы подходящую для Windows 7? Также попробуйте запустить этот perl -e «print @ARGV» aaaa И посмотрите, получаете ли вы какой-либо результат, если вы этого не сделаете, то определенно что-то не так с вашей установкой perl. Если вы это сделаете, у вас, вероятно, есть некоторые конфликты в скрипте, проверьте объем объявленных переменных и т. Д. –

ответ

-2

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

+5

Шебанг не может быть проблемой. В Windows используется ассоциация расширений. Установщик ActiveState связывает файлы .pl с файлом perl. – jira

30

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

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

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

Вариант 1

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

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

Для запуска assoc требуется CMD Запуск от имени администратора на Window 7.

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

Вариант 2

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

Если вы использовали команды ассоциативный/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

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

Windows Registry Editor Version 5.00 

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

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

+0

Дополнительно (для вариантов 2 и 3) может существовать существующий ключ для каждого пользователя, который переопределит это местоположение. Такие, как: HKEY_USERS \ S-XX-XX-XXXXXXX-XXXXXX-XXXXXXX-XXXX \ Software \ Classes \ pl_auto_file. Я бы рекомендовал полностью удалить этот ключ и использовать тот, который находится в варианте 2 или 3. Однако вы также можете просто отредактировать этот ключ (а затем изменение будет работать только для вашего пользователя). – teeks99

6

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

perl myprog.pl a b c 

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

myprog.pl a b c 

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

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

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

assoc .pl=Perl 

и

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

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

myprog.plx a b c 

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

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

открытых программ по умолчанию, нажав кнопку Пуск, а затем нажмите кнопку " Стандартные программы".

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

myprog.pl a b c 

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

Надежда, что помогает ...

+1

Ключевым моментом здесь является просмотр и выбор exe явно. Я часами смотрел на свою установку, и все казалось правильным. Я сделал это, и это сработало отлично! Благодаря! – JamesG

2

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

HKEY_CLASSES_ROOT \ Applications \ perl.exe оболочки \ открытым \ командой \ = «C: \ Perl \ Bin \ perl.exe ""% 1 "% *

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

 Смежные вопросы

  • Нет связанных вопросов^_^