Windows上的Perl,文件关联和I / Oredirect

有人可以解释通过文件关联调用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按预期工作。

为了完整起见,如果上面的链接消失,它建议创建的注册表项是:

  1. 启动注册表编辑器
  2. 找到并单击以下注册表项中的项: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
  3. 在编辑菜单上,单击添加值,然后添加以下注册表值:
    • 值名称: InheritConsoleHandles
    • 数据类型: REG_DWORD
    • 基数: Decimal
    • 价值数据: 1
  4. 退出注册表编辑器。

编辑:我应该补充,即使知识产权文章声称它是在XP SP1中修复的,我已经安装了XP SP3。 所以无论MS打破了这个,还是从来没有把它完全修复,我不能说!

我知道这是一个古老的线索,但重要的是要注意微软似乎已经扭转了这个设置在Windows 10的极性。不知道为什么他们会这样做,但是这让我拉我的头发了一天。 看到我的其他发布的问题( Windows 10上的Perl脚本从资源管理器运行,但不是命令提示符 ),特别是链接的MSDN发布。