I have used your module
Glad to help. Note IPC::Run3 isn't my module (IPC::Run3::Shell, which uses that module, is). By the way, in the comments in the OP you mention DRY, and this is definitely a case where it applies. Here's how I might have coded this in order to avoid as much of the repetition as possible:
my @commands = (
{ name=>'genhealth', arg=>'/sys/general', file=>'genhealthfile' },
{ name=>'bat', arg=>'/env/bat', file=>'batteries' },
# ...
{ name=>'ssd', arg=>'/env/ssd', file=>'ssd_file' },
);
for my $cmd (@commands) {
print "### Working on ", $cmd->{name}, "\n";
run3 ['uemcli', '-d', $vnxe_ip, '-u', $username, '-p', $password,
$cmd->{arg}, 'show', '-detail'], undef, \my $out;
my $str = decode('UTF-16', $out, Encode::FB_CROAK);
my $filename = $cmd->{file}.'.txt';
open (my $fh, '>', $filename) or die "$filename: $!";
print $fh $str;
close $fh;
}
Update: By the way, I don't know why you are using file mode '+>', since that's only needed for R/W access, it seems to me '>' should be enough for your case. Beware of cargo-culting!