在Windows上使用Perl,文件关联和I/O重定向

6
有人能解释一下通过文件关联调用perl脚本与通过perl.exe显式调用相同脚本之间的区别吗?
显然,当通过文件关联调用脚本时,I/O重定向效果不佳,我真的很想知道为什么。
例如,请查看Windows上Perl的Activestate FAQ。只要脚本没有通过重定向接收其输入,cat file示例就可以完美运行。
cat file.txt

正常工作,但是
whoami | cat.pl

不行。不仅需要 .pl 扩展名,而且显然 whoami 的输出没有被传递到脚本中。脚本已经运行(可以通过修改示例的 cat.pl 脚本进行验证),但由于某种原因它没有接收到 whoami 的输出作为输入。

但是,如果我像这样调用脚本:

whoami | perl cat.pl

一切都按预期运行。

显然,通过文件关联运行脚本和显式调用 perl.exe 命令来运行脚本之间存在重要的区别。

常见问题解答中提到了这个问题,并指出使用 pl2bat 生成批处理文件可以解决这个问题,但我不明白为什么需要这样做。

请给我解释一下。


当你说“文件关联”时,你到底是指什么? - innaM
通过文件关联,我指的是.pl扩展名与perl.exe相关联。请查看链接的常见问题解答,因为它包含了详细信息。 - Brian Rasmussen
2个回答

9

看起来这是Windows 2000中已知的一个bug:如果从文件关联启动,STDIN/STDOUT重定向可能无法正常工作

我在WinXP上使用草莓Perl也遇到了您描述的相同行为,但是一旦我创建了上述文章中描述的注册表项(即使reg条目是针对Win2K的),stdin 就可以正常工作。

为了完整起见,以防上面的链接消失,它建议创建的reg条目如下:

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

编辑: 我应该补充说,即使KB文章声称在XP SP1中已修复此问题,我已安装XP SP3。所以无论MS是破坏了它,还是从未完全修复它,我都说不清楚!


我怀疑这是一个Windows问题,而不是Perl问题。感谢提供链接。有了更新的注册表,它按预期工作。 - Brian Rasmussen
如果无法修改注册表,运行 foo | perl -S bar.pl 是 PATH 中脚本的一种不那么烦人的解决方法。 - Michael Carman
谢谢,是的,KB页面声称在XP SP1中“修复”了该问题,但仍需要手动应用注册表修复程序,这一事实令人愤怒!主要问题在于不能假设运行>= XP SP1的任意PC都允许重定向...这正是导致“它在我的机器上工作”的错误繁荣的原因... - j_random_hacker

0

我知道这是一个旧的帖子,但重要的是要注意微软似乎在Windows 10中颠倒了此设置的极性。不知道他们为什么要这样做,但这让我抓狂了一整天。请参阅我发布的其他问题(Perl Scripts on Windows 10 run from Explorer but not Command Prompt),尤其是那里链接的MSDN帖子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接