我使用以下命令在远程Windows框上运行setup_server.exe
:
powershell -command "$encpass=convertto-securestring -asplaintext RPASSWORD -force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList RUSER,$encpass; invoke-command -computername RCOMPUTERNAME -scriptblock {setup_server.exe} -credential $cred;"
setup_server.exe
的任务是创建一些配置文件并启动my_server.exe
(一些守护进程),然后完成。我希望my_server.exe
在setup_server.exe
完成后继续运行。
所以当我通过本地盒子上的CMD(即从CMD运行setup_server.exe
)时,它可以正常工作,但是当我通过远程主机上的powershell进行操作时,它不起作用。即my_server.exe
开始,但在setup_server.exe
关闭后,服务器也会被关闭(被杀)。
所以问题是: 我应该使用哪些powershell标志/ cmdlet使所描述的场景在本地模式下工作?
注意:我希望同步获取setup_server.exe
的输出,因此使用-AsJob
标志运行远程命令可能对我不起作用,尽管我甚至不知道它是否会保留服务器在setup_server.exe
结束后活着。
答案 0 :(得分:2)
在命令完成后保持远程PowerShell会话运行的方法是使用PSSession,例如:
$s = new-PSSession computername
Invoke-Command -session $s { ..script.. }
... do other stuff, remote powershell.exe continues to run
Remove-PSSession $s # when you're done with the remote session
通常情况下,exes应该独立于启动它们的应用程序运行。
答案 1 :(得分:1)
为什么使用Invoke-Command。如果您想要持久会话,请使用Enter-PSSession。
$s = New-PSSession -Computername "Computername";
Enter-PSSession -Session $s;
setup_server.exe
# Once you are finnished
Exit-PSSession
使用'Enter-PSSession',您不仅可以在服务器上调用某个命令,还可以直接登录,就像您可能从SSH中了解一样。
答案 2 :(得分:1)
如果您希望powershell会话继续运行,因为您正在运行exe,请尝试使用-InDisconnectedSession开关。据我所知,它将在未实际连接到您的计算机的会话中运行远程计算机上的可执行文件。实质上,当计算机断开连接时,您的计算机不会销毁会话,从而允许exe继续运行。
invoke-command -computername RCOMPUTERNAME -scriptblock {start-process setup_server.exe} -InDisconnectedSession
如果您需要在多台计算机上执行此操作。设置所有计算机名称的数组。
注意:我不相信这适用于已创建的会话。
答案 3 :(得分:0)
为了在会话出口上运行PowerShell代码,它应该是一个进程。并且保持进程的窗口方式是运行.exe或Windows服务。
答案 4 :(得分:0)
要在执行命令后保持Powershell shell打开,请使用-NoExit开关,例如此脚本与用户管理员一起在服务器名上启动了远程交互式PS会话
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoExit
-Command "Enter-PSSession -ComputerName servername -Credential administrator"
http://powershell-guru.com/powershell-tip-13-prevent-powershell-from-exiting-once-script-finished/