我正在开发一个我必须启动应用程序的部分,这个应用程序应该继续在后台运行。我尝试了如下的Start-Process cmdlet:
try {
Invoke-Command -Session $newsession -Scriptblock {
Write-Host "Cd'ing and starting Vesper on" $loadvm
Start-Process cmd -ArgumentList "/c C:\vesper_cpt\Vesper.exe -auto" -verb runas
} -ErrorAction Stop
} catch [Exception] {
echo "Error while running the remote command", $_.Exception.GetType().FullName, $_.Exception.Message
Remove-PSSession $newsession
exit 1
}
Remove-PSSession $ newsession
发生的事情是,我可以看到它在目标计算机上启动cmd进程,但随后立即消失。我不知道我该怎么做才能让这个过程始终正常运行。另一方面,我也尝试了 Invoke-Expression cmdlet,我可以看到远程机器上的进程已经开始了,但powershell脚本永远不会返回,这就是为什么要考虑使用Start-Process 。有什么建议吗?
答案 0 :(得分:3)
在尝试了很多事情,比如Invoke-Expression,Start-Process之后,我找到了为什么我的进程在远程机器上启动之后才退出的原因。原因是我运行的应用程序是一个Java应用程序。并且,JVM不允许守护程序线程在计算机上运行该进程。另一方面,如果至少有一个用户线程处于活动状态,则Java运行时不会终止您的应用程序。
在我的设置中,我在远程计算机上运行应用程序(在本例中为Vesper.exe),因此我创建了一个 New-PSSession ,最后,我删除-PSSession 即可。因此,没有用户线程来运行应用程序,因此应用程序正在关闭。
对此的解决方案是删除-PSSession ,而不是 Exit-PSSession 。退出-PSSession,使线程保持活动状态,并且您的应用程序不会终止。请注意,您将如何退出应用程序,因为即使您的程序已完成,应用程序仍将在远程计算机上运行。
try {
Invoke-Command -Session $newsession -Scriptblock {
Write-Host "Cd'ing and starting Vesper on" $loadvm
Start-Process cmd -ArgumentList "/c C:\vesper_cpt\Vesper.exe -auto" -verb runas
} -ErrorAction Stop
} catch [Exception] {
echo "Error while running the remote command", $_.Exception.GetType().FullName, $_.Exception.Message
Remove-PSSession $newsession
exit 1
}
Exit-PSSession
如果发现异常,这取决于您想要做什么。您可以根据您的环境设置删除或退出会话。
我从以下两个问题中找到答案:
希望这有帮助。
由于