有人可以解释通过文件关联调用 perl 脚本与通过 perl.exe
显式调用相同脚本之间的区别吗?
显然,当通过文件关联调用脚本时,I/O 重定向不能很好地工作,我真的很想知道为什么。
例如看看 Activestate FAQ for Perl on Windows .只要脚本不通过重定向接收其输入,cat 文件
示例就可以完美运行。所以
cat file.txt
按预期工作,但是
whoami | cat.pl
没有。不仅需要 .pl
扩展名,而且 whoami
的输出显然也没有通过管道传输到脚本中。脚本已运行(可以通过修改示例 cat.pl
脚本来验证),但出于某种原因,它没有接收到 whoami
的输出作为输入。
但是,如果我这样调用脚本:
whoami | perl cat.pl
一切都按预期进行。
显然,通过文件关联运行脚本与使用脚本显式调用 perl.exe
之间存在重要区别。
FAQ 提到了这个问题,并指出使用pl2bat
为脚本生成bat 文件覆盖可以解决问题,但我不明白为什么有必要这样做。
请赐教。
最佳答案
看起来这是 Windows 2000 中的一个已知错误:STDIN/STDOUT Redirection May Not Work If Started from a File Association .
我在 WinXP 上使用 Strawberry Perl 得到了相同的行为,但是一旦我创建了上述文章中描述的注册表项(即使 reg 项针对 Win2K),stdin
的工作方式如下预期。
为了完整起见,如果上面的链接消失了,它建议创建的 reg 条目是:
- 启动注册表编辑器。
- 在注册表中找到并单击以下项:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
- 在“编辑”菜单上,单击“添加值”,然后添加以下注册表值:
- 值名称:
InheritConsoleHandles
- 数据类型:
REG_DWORD
- 基数:
十进制
- 数值数据:
1
- 值名称:
- 退出注册表编辑器。
编辑:我应该补充一点,尽管知识库文章声称它已在 XP SP1 中修复,但我已经安装了 XP SP3。所以 MS 是否已经破坏了它,或者从未完全修复它,我不能说!
关于windows - Windows 上的 Perl、文件关联和 I/O 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1286873/