0

我正在做一个我必须启动一个应用程序并且这个应用程序应该在后台运行的作品。我尝试了 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
}

删除-PSSession $newsession

发生的事情是我可以看到它在目标机器上启动了一个 cmd 进程,但随后它立即消失了。我不确定我应该在这里做什么才能让该过程始终启动并运行。另一方面,我也尝试了Invoke-Expression cmdlet,通过它我可以看到进程在远程机器上启动良好,但 powershell 脚本永远不会返回,这就是为什么想到使用 Start-Process。有什么建议么?

4

1 回答 1

3

在尝试了很多诸如 Invoke-Expression、Start-Process 之类的东西之后,我找到了我的进程在远程机器上启动后退出的原因。原因是我正在运行的应用程序是 Java 应用程序。而且,JVM 不允许守护线程在机器上运行进程。另一方面,如果至少有一个用户线程处于活动状态,Java 运行时不会终止您的应用程序。

在我的设置中,我在远程机器上运行应用程序(在本例中为 Vesper.exe),所以我创建了一个New-PSSession,最后,我是Removing-PSSession。因此,没有剩余的用户线程来运行应用程序,因此应用程序正在关闭。

解决此问题的方法不是Removing-PSSession,而是您要做Exit-PSSession。Exit-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

如果异常被捕获,这取决于你想要做什么。您可以根据您的环境设置删除或退出会话。

我从以下两个问题中找到了答案:

希望这可以帮助。

谢谢

于 2016-04-19T00:43:40.903 回答