我使用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和标准输出/错误?
答案 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