Perl в Windows, ассоциации файлов и перенаправление ввода/вывода

Может ли кто-нибудь объяснить разницу между вызовом Perl-скрипта через ассоциацию файлов и явным вызовом того же скрипта через perl.exe?

По-видимому, перенаправление ввода-вывода не очень хорошо работает, когда скрипт вызывается через ассоциацию файлов, и мне очень хотелось бы знать, почему.

Например. взгляните на Часто задаваемые вопросы об Activestate для Perl в Windows . Пример cat file работает отлично, пока скрипт не получает входные данные через перенаправление. Так

cat file.txt

работает как положено, но

whoami | cat.pl

не. Мало того, что необходимо расширение .pl, но, очевидно, вывод whoami не передается в сценарий. Скрипт запущен (что можно проверить, изменив пример скрипта cat.pl), но по какой-то причине он не получает на вход вывод whoami.

Однако, если я вызову скрипт следующим образом:

whoami | perl cat.pl

все работает как положено.

Таким образом, очевидно, есть важное различие между запуском скрипта через ассоциацию файлов и явным вызовом perl.exe с помощью скрипта.

В FAQ упоминается проблема и указывается, что использование pl2bat для создания обложки bat-файла для скрипта решает проблему, но я не понимаю, зачем это нужно.

Пожалуйста, просветите меня.


person Brian Rasmussen    schedule 17.08.2009    source источник
comment
Что именно вы имеете в виду, когда говорите об ассоциации файлов?   -  person innaM    schedule 17.08.2009
comment
Под ассоциацией файлов я подразумеваю, что расширение .pl связано с perl.exe. Пожалуйста, смотрите связанный FAQ, так как он содержит подробности.   -  person Brian Rasmussen    schedule 17.08.2009


Ответы (2)


Похоже, это была известная ошибка в Windows 2000: перенаправление STDIN/STDOUT может не работать, если оно запущено из файла Ассоциация.

Я получаю то же самое поведение, которое вы описываете с Strawberry Perl на WinXP, однако, как только я создал запись реестра, описанную в статье выше (даже несмотря на то, что запись reg нацелена на Win2K), stdin работает, как и ожидалось.

Для полноты, если ссылка выше исчезнет, ​​запись reg, которую она предлагает создать, будет следующей:

  1. Запустите редактор реестра.
  2. Найдите и щелкните следующий ключ в реестре: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
  3. On the Edit menu, click Add Value, and then add the following registry value:
    • Value name: InheritConsoleHandles
    • Тип данных: REG_DWORD
    • Основание: Decimal
    • Значение данных: 1
  4. Закройте редактор реестра.

Редактировать: я должен добавить, что хотя в статье базы знаний утверждается, что это было исправлено в XP SP1, у меня установлен XP SP3. Так что, сломали ли MS это или никогда не исправили полностью, я не могу сказать!

person Chris J    schedule 17.08.2009
comment
Я подозревал, что это проблема Windows, а не Perl. Спасибо за ссылку. С обновленным реестром все работает как положено. - person Brian Rasmussen; 17.08.2009
comment
Если исправление реестра не является вариантом, запуск foo | perl -S bar.pl менее раздражает для сценариев в вашем PATH. - person Michael Carman; 07.01.2011
comment
Спасибо, и да, тот факт, что на этой странице базы знаний утверждается, что проблема исправлена ​​в XP SP1, когда исправление реестра все еще необходимо применять вручную, приводит в бешенство! Основная проблема заключается в том, что нельзя предположить, что произвольный ПК, работающий под управлением ›= XP SP1, позволит перенаправить... Это именно то, что позволяет процветать ошибкам It Works On My Machine... - person j_random_hacker; 13.04.2011

Я знаю, что это старая тема, но важно отметить, что Microsoft, похоже, изменила полярность этого параметра в Windows 10. Не знаю, почему они это сделали, но это заставило меня рвать на себе волосы в течение дня. См. мой другой опубликованный вопрос (Perl Scripts в Windows 10 запускается из проводника, но не из командной строки), и особенно связанный с ним пост MSDN.

person jimtut    schedule 11.08.2016