将系统命令的输出捕获到文本文件的最佳方法?

发布于 2024-12-10 13:22:47 字数 206 浏览 0 评论 0原文

我试图捕获使用 Perl 的 system 函数来执行系统命令的输出并将其重定向到文件的输出,但由于某种原因,我没有获得完整的输出。

我正在使用以下方法:

system("example.exe >output.txt");

这段代码有什么问题,或者是否有其他方法可以做同样的事情?

I’m trying to capture output from using Perl’s system function to execute and redirect a system command’s ouptut to a file, but for some reason I’m not getting the whole output.

I’m using the following method:

system("example.exe >output.txt");

What’s wrong with this code, or is there an alternative way of doing the same thing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

怪我鬧 2024-12-17 13:22:47

MVS 的答案相同,但现代且安全。

use strict;
use warnings;

open (my $file, '>', 'output.txt') or die "Could not open file: $!";
my $output = `example.exe`; 
die "$!" if $?; 
print $file $output;

则更容易

use strict;
use warnings;

use autodie;

open (my $file, '>', 'output.txt');
print $file `example.exe`;

如果您同时需要 STDOUT 和 STDERR,

use strict;
use warnings;

use autodie;
use Capture::Tiny 'capture_merged';

open (my $file, '>', 'output.txt');
print $file capture_merged { system('example.exe') };

Same as MVS's answer, but modern and safe.

use strict;
use warnings;

open (my $file, '>', 'output.txt') or die "Could not open file: $!";
my $output = `example.exe`; 
die "$!" if $?; 
print $file $output;

easier

use strict;
use warnings;

use autodie;

open (my $file, '>', 'output.txt');
print $file `example.exe`;

if you need both STDOUT and STDERR

use strict;
use warnings;

use autodie;
use Capture::Tiny 'capture_merged';

open (my $file, '>', 'output.txt');
print $file capture_merged { system('example.exe') };
凉墨 2024-12-17 13:22:47

使用 plain > 重定向输出只会捕获 STDOUT。如果您还想捕获 STDERR,请使用 2>&1:

perl -e 'system("dir blablubblelel.txt >out.txt 2>&1");' 

有关更多详细信息,请参阅 Perlmonks

Redirecting the output with plain > will only catch STDOUT. If you also want to catch STDERR, use 2>&1:

perl -e 'system("dir blablubblelel.txt >out.txt 2>&1");' 

For more details, see Perlmonks

悲歌长辞 2024-12-17 13:22:47

当你想要永久重定向输出时,你可以这样做:

#redirect STDOUT before calling other functions
open STDOUT,'>','outputfile.txt' or die "can't open output";
system('ls;df -h;echo something');  #all will be redirected.

When you want recirect output permanently, you can do:

#redirect STDOUT before calling other functions
open STDOUT,'>','outputfile.txt' or die "can't open output";
system('ls;df -h;echo something');  #all will be redirected.
岁吢 2024-12-17 13:22:47

您还可以尝试让 Perl 捕获输出:

open(FILE, ">output.txt") or die "Could not open file: $!";
print FILE `example.exe`;
close(FILE);

You could also try having Perl capture the output instead:

open(FILE, ">output.txt") or die "Could not open file: $!";
print FILE `example.exe`;
close(FILE);
紧拥背影 2024-12-17 13:22:47

我发现这种方式是一种非常好的方法:

use warnings;
use strict;
use Capture::Tiny::Extended 'capture';

my ($out, $err, $ret) = capture {
    system 'example.exe';
};
$ret = $ret >> 8;

print "OUT: $out\n";
print "ERR: $err\n";
print "RET: $ret\n";

感谢 DWGuru 对 Capture::Tiny 的评论::扩展。 :-)

I find this way a very nice way to do it:

use warnings;
use strict;
use Capture::Tiny::Extended 'capture';

my ($out, $err, $ret) = capture {
    system 'example.exe';
};
$ret = $ret >> 8;

print "OUT: $out\n";
print "ERR: $err\n";
print "RET: $ret\n";

Thanks DWGuru for commenting on Capture::Tiny::Extended. :-)

一萌ing 2024-12-17 13:22:47

这是有效的:

在 C 代码中,您可以使用以下行来捕获所需的输出:

system("example.exe > \"output.txt\"");

This works:

In C code, you could have the below line to capture the required output:

system("example.exe > \"output.txt\"");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文