IMHO the problem lies in the fact that the output of powershell can have more than one line. You simply don't know how much output (linewise) is produced by a command. So you don't know how much lines you have to read until you know you grabed the whole output ready to send the next command. This deadlock behaviour is mentioned by the docs of IPC::Open2.
So in your case (after a short look at the help screen of powershell) assuming that the startup of the powershell is more or less cheap I recommend to put the commands you want to be executed by powershell on the commandline of powershell or put it into a file to be read from the powershell and only connect STDOUT of the powershell with STDIN of your perl script to read the command's output.