tags:

views:

74

answers:

4

I have a batch file that is located on one machine that I am invoking remotely from another machine. That batch file is pretty simple; all it does is set some environment variables and then executes an application - the application creates a command window and executes inside of it. The application it executes will run forever unless someone types in the command window in which it is executing "quit", at which point it will do some final processing and will exit cleanly. If I just close the command window, the exit is not clean and that is bad for a number of different reasons related to the data that this application produces. Is there a way for me to perhaps write another batch script that will insert the "quit" command into the first command window and then exit?

A: 

It sounds like the type of job for which I'd use expect, though I've never used it under Windows.

iWerner
A: 

You could use the < to take the "quit" from a text file instead of the console... but that would quit your process as soon as it loads. Would that work? Otherwise you could write a program to send keystrokes to the console... but I don't think this is a production quality trick.

Nestor
A: 

Do you have access to the actual code of the application? if so you can check for a batch file. Else you can do something like the following using powershell.

    $Process = Get-Process | Where-Object {$_.ProcessName -eq "notepad"}If (!($Process))
{   "Process isn't running, do stuff"
}Else
{   $myshell.AppActivate("notepad")
    $myshell.sendkeys("Exit")
}

I am only suggesting powershell as its easy for you to call the code. you could also put in a loop and wait for it to run.

RE

Reallyethical
A: 

I'd write a little script using the subprocess module in python, like so:

from subprocess import Popen, PIPE
import os
import os.path
import time

app = Popen(['c:/path/to/app.exe', 'arg1', 'arg2'], stdin=PIPE, env = {
    'YOUR_ENV_VAR_1': 'value1',
    'YOUR_ENV_VAR_2': 'value2',
    # etc as needed to fill environment
    })

while not os.path.exists('c:/temp/quit-app.tmp'):
    time.sleep(60)

app.communicate('quit\n')

print "app return code is %s" % app.returncode

Then, you remotely invoke a batch script that creates c:/temp/quit-app.tmp when you want to shut down, wait a couple of minutes, and then deletes the file.

Naturally, you need Python installed on the Windows machine for this to work.

Walter Mundt
Thanks Walter! This solution worked great. The command goes through and everything, but the only issue is that the quit process doesn't actually get initialized until I manually go to that command prompt and type in any input (the letter 'a', Enter, Space, whatever). As soon as I hit any key the remotely executed program starts to exit cleanly like it should. Any idea why that is the case?
Bozzy