6

誰かがファイルの関連付けを介してperlスクリプトを呼び出すことと、同じスクリプトを明示的に呼び出すことの違いを説明できますかperl.exe

スクリプトがファイルの関連付けを介して呼び出された場合、I / Oリダイレクトはうまく機能しないようです。その理由を、本当に知りたいと思います。

たとえば、Windows上のPerlのActivestateFAQを見てください。cat fileスクリプトがリダイレクトを介して入力を受け取らない限り、この例は完全に機能します。それで

cat file.txt

期待どおりに動作しますが

whoami | cat.pl

ではない。.pl拡張機能が必要なだけでなく、の出力がwhoamiスクリプトにパイプされていないようです。スクリプトは実行されますが(サンプルcat.plスクリプトを変更することで確認できます)、何らかの理由で、の出力をwhoami入力として受け取りません。

ただし、次のようにスクリプトを呼び出すと、次のようになります。

whoami | perl cat.pl

すべてが期待どおりに機能します。

したがって、ファイルの関連付けを介してスクリプトを実行することと、スクリプトを明示的に呼び出すことには、明らかに重要な違いがありperl.exeます。

pl2batFAQには問題が記載されており、スクリプトのbatファイルカバーを生成するために使用すると問題が解決することが指摘されていますが、なぜこれが必要なのかわかりません。

教えてください。

4

2 に答える 2

9

Windows 2000の既知のバグのようです。ファイルの関連付けから開始すると、STDIN/STDOUTリダイレクトが機能しない場合があります

WinXPのStrawberryPerlで説明したのと同じ動作が得られますが、上記の記事で説明したレジストリエントリを作成すると(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で修正されたと主張していますが、XPSP3がインストールされていることを追加する必要があります。したがって、MSがこれを破ったのか、それとも完全に修正したことがないのか、私には言えません。

于 2009-08-17T10:04:35.720 に答える
0

これは古いスレッドですが、MicrosoftがWindows 10でこの設定の極性を逆にしたように見えることに注意することが重要です。なぜそうなるのかわかりませんが、これで1日髪を抜くことができました。私の他の投稿された質問(Windows 10のPerlスクリプトはエクスプローラーから実行されますが、コマンドプロンプトでは実行されません)、特にそこにリンクされているMSDNの投稿を参照してください。

于 2016-08-11T15:59:03.483 に答える