2009-08-17 14 views
6

有人可以解釋通過文件關聯調用perl腳本與通過perl.exe明確調用相同腳本之間的區別嗎?Windows上的Perl,文件關聯和I/O重定向

顯然,當通過文件關聯調用腳本時I/O重定向不起作用,我真的很想知道爲什麼。

E.g.看看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文件封面可以修復問題,但我不明白爲什麼這是必需的。

請賜教。

+0

你的意思是什麼,當你說「文件關聯」? – innaM 2009-08-17 09:39:01

+0

通過文件關聯我的意思是.pl擴展名是與perl.exe相關的。請參閱鏈接的FAQ,因爲它包含了詳細信息。 – 2009-08-17 09:48:07

回答

9

它看起來像是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. 退出註冊表編輯器。

編輯:我應該補充的是,即使KB文章聲稱它是固定在XP SP1,我已經安裝了XP SP3。所以無論MS是否已經破壞了這個,或者從來沒有完全修復它,我不能說!

+0

我懷疑這是一個Windows問題,而不是Perl問題。感謝您的鏈接。隨着更新的註冊表,它按預期工作。 – 2009-08-17 11:04:25

+0

如果修補註冊表不是運行'foo | perl -S bar.pl'對於PATH中的腳本來說不那麼麻煩。 – 2011-01-07 18:02:51

+0

謝謝,是的,這是KB頁聲稱問題XP SP1是「固定」的時候,註冊表修復仍需要手動應用是真氣的事實!主要的問題是,不能認爲運行> = XP SP1的任意一臺PC將允許重定向......這正是允許「它適用於我的機器」的錯誤繁榮...... – 2011-04-12 20:51:21