Windows上的Perl,文件关联和I/O重定向

Bri*_*sen 6 windows perl redirect file-association

有人能解释通过文件关联调用perl脚本与通过显式调用相同脚本之间的区别perl.exe吗?

显然,当通过文件关联调用脚本时,I/O重定向不能很好地工作,我真的很想知道原因.

例如,在Windows上查看PerlActivestate FAQ.cat file只要脚本没有通过重定向接收输入,该示例就可以正常工作.所以

cat file.txt
Run Code Online (Sandbox Code Playgroud)

按预期工作,但是

whoami | cat.pl
Run Code Online (Sandbox Code Playgroud)

才不是.不仅.pl需要扩展,而且显然输出whoami不会通过管道传输到脚本中.运行脚本(可以通过修改示例cat.pl脚本来验证),但由于某种原因,它不会接收whoami输入的输出.

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

whoami | perl cat.pl
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.

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

常见问题解答提到了这个问题,并指出pl2bat用于为脚本生成bat文件封面修复了问题,但我不明白为什么这是必要的.

请赐教.

Chr*_*s J 9

看起来它是Windows 2000中的已知错误:如果从文件关联启动,STDIN/STDOUT重定向可能不起作用.

我得到你在WinXP上用Strawberry Perl描述的相同行为,但是一旦我创建了上面文章中描述的注册表项(即使reg条目针对Win2K),stdin按预期工作.

为了完整性,如果上面的链接消失,它建议创建的reg条目是:

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

编辑:我应该补充一点,即使KB文章声称它已在XP SP1中修复,我已经安装了XP SP3.所以,无论MS是打破了这个,还是从未完全修复它,我都说不出来!