in reply to open2 with windows diskpart

You're going through a lot of trouble to ignore exceptions that don't even exist.

my $pid; eval { $pid = open2(\*OUT, \*IN, 'diskpart'); }; if ($@ and $@ =~ /^open2:/) { die "$@:$!\n"; }

should be

my $pid = open2(\*OUT, \*IN, 'diskpart');

$! is already included in the error message if appropriate. Even in some situations where it's not. (Perl RT66572)

Replies are listed 'Best First'.
Re^2: open2 with windows diskpart
by wxfield (Novice) on Jun 17, 2009 at 00:51 UTC

    I think autoflush is set to true by default, and you are probably right about me checking for too many errors. Other than those items, were you able to get the snippet to function on Windows with diskpart?

      Worked fine for me simply by adding the missing "\n" I mentioned.

      I had problem detecting the prompt because it's not sent until the line is ended (which doesn't happen until someone types since the output appears to be line buffered). I solved that by forcing the prompt to show up twice.

      use strict; use warnings; use IO::Handle qw( ); use IPC::Open2 qw( open2 ); sub wait_for_prompt { my ($to_chld, $fr_chld) = @_; # Force two prompts to appear. print $to_chld "\n"; my $count; while (<$fr_chld>) { print "$.: $_"; last if /^DISKPART> $/ && ++$count == 2; } } { my $pid = open2(my $fr_chld, my $to_chld, 'diskpart'); #print $to_chld "\n"; #wait_for_prompt($to_chld, $fr_chld); print $to_chld "list disk\n"; wait_for_prompt($to_chld, $fr_chld); print $to_chld "exit\n"; wait_for_prompt($to_chld, $fr_chld); close $to_chld; waitpid($pid, 0); }

        I think I must be either missing something in my perl distro or maybe my OS ver is messing this up for me. I still can't seem to get this working.