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

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

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

Е. Г. взгляните на ActiveState FAQ для Perl в Windows. The cat file пример работает отлично, пока скрипт не получает свой ввод через переадресация. Так что

cat file.txt

работает, как ожидалось, но

whoami | cat.pl

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

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

whoami | perl cat.pl

все работает как ожидаемый.

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

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

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

2 ответов


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

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

для полноты, в случае, если ссылка выше уходит, запись reg предлагает создать есть:

  1. Запустить Редактор Реестра.
  2. найдите и нажмите следующий раздел в реестре: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
  3. в меню Правка выберите пункт Добавить значение и добавьте следующий параметр реестра :
    • Значение Имени: InheritConsoleHandles
    • тип данных: REG_DWORD
    • Radix:Decimal
    • значение: 1
  4. Выйти Из Реестра Редактор.

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


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