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



>我使用 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%" }

进程运行,但现在我看不到它的标准输出!当我在本地使用启动进程(没有调用命令)时,我看到了输出。

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

使用后台作业。您可以启动本地作业以调用远程主机上的命令:

$job = Start-Job -ScriptBlock {
  Invoke-Command -ComputerName $computer -ScriptBlock {
    Set-Location 'C:somefolder'
    & 'C:pathtoyour.exe' $args
  } -ArgumentList $args
} -ArgumentList $argument_list

或者打开与远程主机的会话并在那里启动本地作业:

Enter-PSSession -Computer $computer
$job = Start-Job -ScriptBlock {
  Set-Location 'C:somefolder'
  & 'C:pathtoyour.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

最新更新