EM0
EM0

Reputation: 6327

Run console EXE remotely with PowerShell and get its process ID and stdout

I use PowerShell to run a console EXE on a remote server and see its output like this:

 Invoke-Command -ComputerName %SERVER_NAME% -ScriptBlock { Set-Location "%EXE_DIR%" ; .\MyExe.exe %EXE_ARGS% }

This works, but gives me no way to kill the process, except connecting to the server via RDP. If I could just save its process ID to a file I should be able to kill it using Stop-Process. I tried this:

 Invoke-Command -ComputerName %SERVER_NAME% -ScriptBlock { Start-Process -NoNewWindow -PassThru -Wait -WorkingDirectory "%EXE_DIR%" "%EXE_DIR%\MyExe.exe" "%EXE_ARGS%" }

The process runs, but now I don't see its standard output! When I use Start-Process locally (without Invoke-Command) I see the output.

How can I get both the process ID and the standard output/error?

Upvotes: 0

Views: 1788

Answers (1)

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200193

Use a background job. You can either start a local job to invoke a command on a remote host:

$job = Start-Job -ScriptBlock {
  Invoke-Command -ComputerName $computer -ScriptBlock {
    Set-Location 'C:\some\folder'
    & 'C:\path\to\your.exe' $args
  } -ArgumentList $args
} -ArgumentList $argument_list

or open a session to a remote host and start a local job there:

Enter-PSSession -Computer $computer

$job = Start-Job -ScriptBlock {
  Set-Location 'C:\some\folder'
  & 'C:\path\to\your.exe' $args
} -ArgumentList $argument_list

Exit-PSSession

Job output can be received via Receive-Job:

while ($job.HasMoreData) {
    Receive-Job $job
    Start-Sleep -Milliseconds 100
}

You can terminate it via its StopJob() method:

$job.StopJob()

Remove-Job removes the job from the job list:

Remove-Job $job

Upvotes: 1

Related Questions