有人可以解释通过文件关联调用perl脚本与通过perl.exe
显式调用相同的脚本之间的区别吗?
显然,当通过文件关联调用脚本时,I / Oredirect不能很好地工作,我真的很想知道为什么。
例如,看看Windows上的Perl的ActiveState FAQ 。 只要脚本没有通过redirect接收到input, cat file
例子就可以正常工作。 所以
cat file.txt
按预期工作,但是
whoami | cat.pl
才不是。 不仅需要.pl
扩展名,而且显然whoami
的输出没有传送到脚本中。 脚本运行(可以通过修改示例cat.pl
脚本来validation),但由于某种原因,它不会接收whoami
的输出作为input。
但是,如果我像这样调用脚本:
whoami | perl cat.pl
一切按预期工作。
所以显然,通过文件关联运行脚本和显式调用perl.exe
脚本之间存在着重要的区别。
常见问题解答提到这个问题,并指出使用pl2bat
为脚本生成一个bat文件封面解决了这个问题,但我不明白为什么这是必要的。
请赐教。
它看起来像是Windows 2000中的一个已知错误: 如果从文件关联开始,STDIN / STDOUT重定向可能不起作用 。
我在WinXP中得到了与Strawberry Perl描述的相同的行为,但是一旦我创建了上述文章中描述的注册表项(即使reg条目是针对于Win2K的), stdin
按预期工作。
为了完整起见,如果上面的链接消失,它建议创建的注册表项是:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
InheritConsoleHandles
REG_DWORD
Decimal
1
编辑:我应该补充,即使知识产权文章声称它是在XP SP1中修复的,我已经安装了XP SP3。 所以无论MS打破了这个,还是从来没有把它完全修复,我不能说!
我知道这是一个古老的线索,但重要的是要注意微软似乎已经扭转了这个设置在Windows 10的极性。不知道为什么他们会这样做,但是这让我拉我的头发了一天。 看到我的其他发布的问题( Windows 10上的Perl脚本从资源管理器运行,但不是命令提示符 ),特别是链接的MSDN发布。