【问题标题】:Perl on Windows, file associations and I/O redirectionWindows 上的 Perl、文件关联和 I/O 重定向
【发布时间】:2010-11-20 04:31:00
【问题描述】:

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

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

例如看看Activestate FAQ for Perl on Windows。只要脚本不通过重定向接收其输入,cat file 示例就可以完美运行。所以

cat file.txt

按预期工作,但是

whoami | cat.pl

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

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

whoami | perl cat.pl

一切都按预期进行。

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

FAQ 中提到了这个问题,并指出使用pl2bat 为脚本生成一个bat 文件封面可以解决这个问题,但我不明白为什么这是必要的。

请赐教。

【问题讨论】:

  • 你说的“文件关联”到底是什么意思?
  • 通过文件关联,我的意思是 .pl 扩展名与 perl.exe 关联。请查看链接的常见问题解答,因为它包含详细信息。

标签: windows perl redirect file-association


【解决方案1】:

看起来这是 Windows 2000 中的一个已知错误:STDIN/STDOUT Redirection May Not Work If Started from a File Association

我在 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. 退出注册表编辑器。

编辑:我应该补充一点,尽管知识库文章声称它已在 XP SP1 中修复,但我已经安装了 XP SP3。因此,MS 是否已经破坏了它,或者从未完全修复它,我不能说!

【讨论】:

  • 我怀疑这是 Windows 问题,而不是 Perl 问题。感谢您的链接。使用更新后的注册表,它可以按预期工作。
  • 如果修补注册表不是一个选项,运行 foo | perl -S bar.pl 对 PATH 中的脚本来说是不那么烦人的解决方法。
  • 谢谢,是的,当仍然需要手动应用注册表修复时,KB 页面声称该问题在 XP SP1 中已“修复”这一事实令人愤怒!主要问题是不能假设运行 >= XP SP1 的任意 PC 将允许重定向......这正是允许“它在我的机器上工作”错误蓬勃发展的那种东西......
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多