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