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 предлагает создать есть:
- Запустить Редактор Реестра.
- найдите и нажмите следующий раздел в реестре:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
- в меню Правка выберите пункт Добавить значение и добавьте следующий параметр реестра :
- Значение Имени:
InheritConsoleHandles
- тип данных:
REG_DWORD
- Radix:
Decimal
- значение:
1
- Значение Имени:
- Выйти Из Реестра Редактор.
Edit: я должен добавить, что, хотя статья KB утверждает, что она была исправлена в XP SP1, у меня установлен XP SP3. Так ли MS сломали это, или никогда не исправили его полностью, я не могу сказать!
Я знаю, что это старый поток, но важно отметить, что Microsoft, похоже, поменяла полярность этого параметра в Windows 10. Не знаю, зачем они это сделали, но это заставило меня выдернуть волосы на день. См. Мой другой вопрос (Perl Скрипты в Windows 10 запускаются из проводника, но не из командной строки), и особенно связанный пост MSDN там.