Fellow Monks,
Is there a way to determine on a windows platform if a perl script is invoked by double-clicking on the file, through the "File association" ?
My issue is that when I run from a DOS prompt and my script provides logging to STDOUT, the logging is visible after the script ends. When I double-click, the perl script starts in its own DOS box, outputs its logging to STDOUT, finishes, and the DOS box vanishes. I end up having to put:
print "Hit <Enter> to continue\n";
my $y = <STDIN>;
at the end of all my scripts. I want that code to be conditional on being invoked from a double-click file association.
thanks for you help,
- j
Update:
I was having trouble with the ouse.pm solution. It's good for double-clicking. However, if I invoke a script from the command line as:
> foo.pl
instead of
> perl foo.pl
I get the wait condition in the first case because the file association is still being used.
I updated ouse.pm to use the
Win32::Process::Info module to see if the parent process is Windows Explorer.
UPdate 2: forgot a line
=head1 NAME
ouse.pm
=head1 SYNOPSIS
perl -Mouse file.pl
=head1 DESCRIPTION
Install in your perl/lib or perl/site/lib directory
in a file named "ouse.pm". Then enter the following
commands:
assoc .pl=Perl
ftype Perl=C:\Progra~1\perl\bin\perl -Mouse "%1" %*
Then clicking on a *.pl file will cause the script to
run in a new window but the window will (usually)
not close when the script finishes.
=head1 AUTHOR
tye
http://perlmonks.org/index.pl?node_id=162087
=cut
use Win32::Process::Info;
END
{
#-- find the parent process;
my $pi = Win32::Process::Info->new();
my @info = $pi->GetProcInfo ( $$);
my @pinfo = $pi->GetProcInfo ( @info[0]->{ParentProcessId} );
#-- see if the parent process is the windows explorer.
if ( $pinfo[0]->{CommandLine} =~ /explorer/i )
{
eval " use Term::ReadKey; ";
unless($@)
{
print "Press any key to close...";
ReadMode(3);
ReadKey();
ReadMode(0);
}
else
{
print "Press ENTER to close: ";
<STDIN>;
}
}
}
1;