我想在远程本地PowerShell脚本上停止winform应用程序,但CloseMainWindow
函数似乎不起作用
---这是连接远程服务器以执行存储在server--
上的closeApp.ps1的本地命令$remoteSession = New-PSSession -computerName 'xxx' -credential $cred
Invoke-Command -session $remoteSession -command {F:\AutoDeployment\closeApp.ps1}
Remove-pSSession -session $remoteSession
---这是closeApp.ps1的主要内容,它会获得活动进程并尝试关闭它 -
$app = Get-Process AppName -ErrorAction SilentlyContinue
if($app)
{
$app.MainWindowTitle
$app.CloseMainWindow()
}
我希望它应该像当地人那样正确地关闭app。
但现在它为mainWindowTitle
行返回null,为closeMainWindow
返回False。
如果直接在服务器上运行,此脚本可以正常运行,但是当通过invoke-command
执行时,MainWindow
似乎无效且无效。
我通过jenkins plugin powershell
调用此命令更新
invoke-command
的{{1}}没有错误记录,但它始终返回' False'预计将是真的'。
我还有一个步骤,如果closeMainWindow
失败,我会尝试发送关键操作以停止该应用。我使用closeMainWindow
来实现这一目标。
它也可以在本地工作但在服务器上通过{:1}}失败:
[System.Windows.Forms.SendKeys]::SendWait
的错误日志:
invoke-command
答案 0 :(得分:0)
我怀疑在远程调用期间没有加载Winforms的程序集,因此您没有可用的CloseMainWindow函数。尝试显式加载程序集,如下所示:
Add-Type -AssemblyName System.Windows.Forms
$Form = New-Object system.Windows.Forms.Form
由于您未提供有关错误代码的足够信息,因此您可以尝试以下操作,通过绕过该运行来排除执行策略限制:
$remoteSession = New-PSSession -computerName 'xxx' -credential $cred
Invoke-Command -session $remoteSession -command {powershell.exe -execution Bypass -file 'F:\AutoDeployment\closeApp.ps1'}
Remove-pSSession -session $remoteSession
答案 1 :(得分:0)
我想我现在想出为什么这个问题发生了,并希望这对任何人都有帮助。
Windows只是阻止任何远程操作调用交互式进程(据我所知),因此每次我尝试通过远程计算机中的invoke-command
启动进程时,它只会启动一个'鬼'过程,它是不可见的。所以我认为这就是为什么我无法正常使用closeMainWindow
功能,因为它与UI相关。
我的目的是对远程可见程序执行某些操作(发送密钥)以进行自动部署,因此我发现唯一的方法是使用schtasks
来安排远程操作,让远程执行UI部件本身。这对我来说很好。