CloseMainWindow在invoke-command中不起作用

时间:2017-12-08 11:07:39

标签: powershell jenkins

我想在远程本地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

2 个答案:

答案 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部件本身。这对我来说很好。