Re: Run an external program and capture its output

[email protected] (kmx) Thu, 17 Apr 2014 09:14:45 +0200
Newsgroups perl.win32.vanilla
Message-ID <[email protected]>
On 17.4.2014 8:47, John Emmas wrote:
> Firstly, please forgive me if this isn't the right place for asking this 
> question.  I tried a couple of programmer's forums but up to now, my 
> question hasn't even gained one answer!  And yet it seems like a simple 
> (and probably very common) requirement.  I'm hoping that someone here 
> will take pity on me!
>
> I've been using Strawberry perl for about 6 months and I'm generally 
> happy with it.  The one thing I just can't seem to make it do is to run 
> an external program and capture that program's output to a file.  I came 
> across perl's 'system' command.  Let's say I add these lines to a perl 
> script:-
>
>         @my_command = ( "the_exe_name", "arg1", "arg2", "etc" );
>         system(@my_command);
>
> If I now open a DOS window and run the perl script, sure enough, it runs 
> 'the_exe_name'.  And if my exe produces any text output I can see that 
> output in my DOS window..  Suppose my perl script is called 
> "my_perl_script.pl".  If I try to redirect its text output (like this) 
> something interesting happens:-
>
>         my_perl_script.pl > output.txt
>
> The above seems to work in Windows 7.  However, it doesn't work in 
> Windows 8 or Windows XP.  In both cases, the file "output.txt" does get 
> created.  And in both cases I no longer see the exe's output text in my 
> DOS window (i.e. as if it's getting redirected to the file).  But at the 
> end of the process (in both cases) output.txt will be an empty file.  :-(
>
> My next thought was to handle any redirection within the actual perl 
> script - i.e.
>
>         @my_command = ( "the_exe_name", "arg1", "arg2", "etc" ">", 
> "output.txt" );
>         system(@my_command);
>
> Unfortunately, that doesn't seem to work either (again, it always creates 
> an empty file).
>
> Is there a way to achieve this using Strawberry perl?  Or am I making 
> some rookie mistake here?  Admittedly I'm not very experienced with perl 
> but I'm amazed that such a simple task seems to defeat it  :-(

Try:

my $output = `the_exe_name arg1 arg2`;

Or have a look at https://metacpan.org/pod/IPC::Run3

use IPC::Run3;
my $output;
run3(["the_exe_name", "arg1", "arg2", "etc"], undef, \$output);

--
kmx