使用PowerShell远程运行控制台EXE并获取其进程ID和标准输出

时间:2016-03-07 15:33:29

标签: powershell

我使用PowerShell在远程服务器上运行控制台EXE并查看其输出如下:

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

这样可行,但除了通过RDP连接到服务器之外,我无法终止该过程。如果我可以将其进程ID保存到文件中,我应该可以使用Stop-Process将其删除。我试过这个:

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

该过程运行,但现在我没有看到它的标准输出!当我在本地使用Start-Process(没有Invoke-Command)时,我看到了输出。

如何同时获取进程ID和标准输出/错误?

1 个答案:

答案 0 :(得分:1)

使用background job。您可以启动本地作业以在远程主机上调用命令:

$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

或打开远程主机的会话并在那里开始本地工作:

Enter-PSSession -Computer $computer

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

Exit-PSSession

可以通过Receive-Job

接收作业输出
while ($job.HasMoreData) {
    Receive-Job $job
    Start-Sleep -Milliseconds 100
}

您可以通过StopJob()方法终止它:

$job.StopJob()

Remove-Job从作业列表中删除作业:

Remove-Job $job