in reply to Reading progress of "copy" executed asynchronously

use strict; use warnings; my $cmd = 'copy.exe'; my @args = ('from', 'to', '/z'); open(EXE, '-|', $cmd, @args) || die "$!"; while(<EXE>){ print "read from program output: ".$_."\n"; } print "done.\n"; close(EXE);

(Update1) Alternatively, if in unix/bash, create a script which forks a copy process and a filestat process. When the copy process finishes, the filestat process is killed. You can use the above perl script to run it.

#!/bin/bash FROM=$1 TO=$2 cp "${FROM}" "${TO}" & wPID1=$! echo "$0 : copy-process, pid is $wPID1" (for((;;)); do stat -c '%s' "${TO}"; sleep 1; done) & wPID2=$! echo "$0 : filestat-process, pid is $wPID2" wait ${wPID1} # wait for copy-process to finish echo "$0 : copy-process is finished" kill ${wPID2} echo "$0 : filestat-process killed"

You could also use the same logic of the bash script in Perl.

Replies are listed 'Best First'.
Re^2: Reading progress of "copy" executed asynchronously
by neWerminder (Novice) on Aug 09, 2018 at 04:44 UTC
    hey, none of the above works on Windows unfortunately. First option is out due to -| which apparently is not supported on windows. I receive "List form of pipe open not implemented". Second option wont work because windows for some reason shows that size of file "to" is same as size of file "from" in the moment copying started.. ;/ at least in any of methods i know.

      I was not aware Windows reports incorrect filesizes. Then you have to rely on copy's reporting. Use this pipe-open form instead:

      use strict; use warnings; my $cmd = 'copy.exe 'from', 'to', '/z' |'; open(EXE, $cmd) || die "$!"; while(<EXE>){ print "read from program output: ".$_."\n"; } print "done.\n"; close(EXE);

      Or use IPC::Run or any other IPC::* module mentioned here or there.

        Hello

        As for code it wont work. i tried earlier on and it gives output only when its done but i need to monitor progress

        As for IPC ill check