Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked

Re: How to close command prompts opened with perl script after execution that script

by ig (Vicar)
on Aug 06, 2012 at 15:09 UTC ( #985748=note: print w/replies, xml ) Need Help??

in reply to How to close command prompts opened with perl script after execution that script

Starting the cmd windows as you are, it is difficult to kill them as you don't have a handle or PID for them.

If your commands are unique enough, you might use taskkill to kill the processes.

You could use Win32::Process to start the command processes then terminate them, something like:

use strict; use warnings; use Win32::Process; my $cmd = 'dir'; #system("start cmd.exe /k $cmd"); my $processObj; Win32::Process::Create( $processObj, "C:/windows/system32/cmd.exe", "cmd.exe /k $cmd", 0, NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, "." ); sleep(10); # do other stuff $processObj->Kill(0);

Replies are listed 'Best First'.
Re^2: How to close command prompts opened with perl script after execution that script
by snreddy_gopu (Novice) on Aug 07, 2012 at 04:38 UTC
    Thanks ig. It's working fine. I have small doubt. I have opened two command prompts as you mentioned above using perl script. Is it possible to run any commands which are not specified in $cmd variable on opened prompts? I mean to say "First perl script opens a command prompt. Then executes whatever the command in the $cmd varible. Now i want to run one more command on that opened prompt before closing it using $processObj->Kill(0)"

      That I don't know.

      Several options come to mind:

      • Implement the required functions in Perl so I don't have to call a bunch of other executables
      • Run each command separately (system, backticks or whatever), reading output back into perl, then present the output as appropriate, rather than trying to manage a bunch of separate command windows and processes running cmd.exe
      • Compose a batch file then run it
      • Try to establish a pipe to STDIN of cmd.exe and feed it commands, but then probably need something like IPC3::Open and Expect (but maybe not Expect itself on Windows - I don't know if it works there) and it quickly gets more complicated.

      Having a *nix background, I don't much like the Windows way of doing process management. I find they make simple things, like process management and IPC very hard to do. For example, I still haven't found a simple way to get unbuffered I/O between a parent process and its child, or do anything like what process groups make easy on *nix. Being lazy, I do my best to avoid such issues. But this is my fault - probably not something you should emulate.

        Thanks for your information ig. Is it possible to open duplicate session in unix using Perl?
        is there any way to capture the output in that newly opened command prompt.

      $processObj->Kill(0); is not working for me to close the created process object, can anyone help me on this. thanks, Sarath S

        my $cmd = "adb shell cat /proc/kmsg | tee kernel_logs.txt"; print $cmd; my $processObj; Win32::Process::Create( $processObj, "C:/windows/system32/cmd.exe", "cmd.exe /k $cmd", 0, NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, "." )|| die ErrorReport(); sleep(3); $processObj->Kill(0); this was my code, but after sleep processObj is not getting killed.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://985748]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (5)
As of 2017-02-20 20:38 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (302 votes). Check out past polls.