Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I make my Perl scripts act like normal programs on Windows?

Tags:

windows

perl

I want my Perl scripts to behave just like any other executable (*.exe file).

  • When I double-click on myscript.pl I want it to execute instead of opening in a text editor.
  • I want to run myscript.pl instead of perl myscript.pl.
  • I really want to run myscript instead of myscript.pl.
  • I want to run program | myscript instead of program | perl myscript.pl.
  • I want to be able to run my script via drag & drop.

There are a number of changes you have to make on Windows to make all of these things work. Users typically stumble upon things that don't work one at a time; leaving them confused whether they've made an error, there's a bug in Perl, there's a bug in Windows, or the behavior they want just isn't possible. This question is intended to provide a single point of reference for making everything work up front; ideally before these problems even occur.

Related questions:

  • How do I make Perl scripts recognize parameters in the Win32 cmd console?
  • Running a perl script on windows without extension
  • Perl execution from command line question
  • How can I read piped input in Perl on Windows?
  • Perl on Windows, file associations and I/O redirection
  • How do I create drag-and-drop Strawberry Perl programs?
like image 429
Michael Carman Avatar asked Jan 18 '11 18:01

Michael Carman


People also ask

Does Perl run on Windows?

Perl does not come pre-installed with Windows. To work with Perl programs on Windows, Perl will need to be manually downloaded and installed. ActiveState offers a complete, ready-to-install version of Perl for Windows. Click on the appropriate download link.


1 Answers

Note: The actions below require administrative privileges. For steps utilizing the command prompt it must be launched via "Run as administrator" on Windows Vista / Windows 7.

Associate *.pl files with perl

Run the following commands at a shell prompt:

assoc .pl=PerlScript ftype PerlScript=C:\bin\perl.exe "%1" %* 

Replace C:\Perl\bin\perl.exe with the path to your Perl installation. This enables you to run myscript.pl instead of perl myscript.pl.

Default install locations are:

  • ActivePerl: C:\Perl
  • Strawberry Perl: C:\Strawberry

Add .PL to your PATHEXT environment variable.

This makes Windows consider *.pl files to be executable when searching your PATH. It enables you to run myscript instead of myscript.pl.

You can set it for the current cmd session

set PATHEXT=%PATHEXT%;.PL 

To set it permanently (under Windows Vista or Windows 7)

setx PATHEXT %PATHEXT%;.PL 

Under Windows XP you have to use the GUI:

  1. Right-click My Computer, and then click Properties.
  2. Click the Advanced tab.
  3. Click Environment variables.
  4. Select PATHEXT, then click Edit.
  5. Append ;.PL to the current value.

Make I/O redirection work

I/O redirection (e.g. program | myscript) doesn't work for programs started via a file association. There is a registry patch to correct the problem.

  1. Start Registry Editor.
  2. Locate and then click the following key in the registry: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
  3. On the Edit menu, click Add Value, and then add the following registry value:
    • Value name: InheritConsoleHandles
    • Data type: REG_DWORD
    • Radix: Decimal
    • Value data: 1
  4. Quit Registry Editor.

Warning: In principle, this should only be necessary on Windows XP. In my experience it's also necessary in Windows 7. In Windows 10 this is actively harmful—programs execute but produce nothing on stdout/stderr. The registry key needs to be set to 0 instead of 1.

See also:

  • STDIN/STDOUT Redirection May Not Work If Started from a File Association
  • Perl Scripts on Windows 10 run from Explorer but not Command Prompt

If patching the registry isn't an option running program | perl -S myscript.pl is a less annoying work-around for scripts in your PATH.

Add a drop handler

Adding a drop handler for Perl allows you to run a Perl script via drag & drop; e.g. dragging a file over the file icon in Windows Explorer and dropping it there. Run the following script to add the necessary entries to the registry:

use Win32::TieRegistry; $Registry->Delimiter("/"); $perlKey = $Registry-> {"HKEY_CLASSES_ROOT/Perl/"}; $perlKey-> {"shellex/"} = {     "DropHandler/" =>  {         "/" => "{86C86720-42A0-1069-A2E8-08002B30309D}" }}; 
like image 198
Michael Carman Avatar answered Sep 29 '22 02:09

Michael Carman