I used to use IPC::Open3 for this type of thing. Now I use AnyEvent::Util::run_cmd:
use AnyEvent;
use AnyEvent::Util;
use File::Spec;
my ($stdout, $stderr) = ('', ''); # I think these need to be empty str
+ings, not undefs
my $pid;
my $cv = AnyEvent::Util::run_cmd [ qw(xcopy /Y /S /E /I /F /R /K), $so
+urce, $dest ],
'<' => File::Spec->devnull(),
'>' => \$stdout,
'2>' => \$stderr,
'$$' => \$pid, # this line is optional, you may not need it.
;
my $rc = $cv->recv();
(You can even run more than one of these at a time if you want, with a little extra code.)