powershell如何关闭.exe进程

时间:2015-09-03 21:53:09

标签: powershell

我想从powershell启动一个.exe文件并等待它完成,然后继续执行powershell中的下一行。但是,在.exe文件完成它的工作后,窗口仍然在那里手动关闭。就像记事本一样。这是我得到的

start-process -FilePath notepad -Wait -NoNewWindow
echo "it's done!"

我指定了-NoNewWindow,但它仍然带有一个窗口,而powershell必须等到我手动关闭它。如何自动关闭它? .exe文件是我无法控制的第三方应用程序。

请注意,我想等待.exe文件完成的任务,然后自动关闭该窗口,以便我可以继续执行powershell中的下一行。

我也试过-WindowStyle隐藏。

start-process -FilePath notepad -Wait -WindowStyle hidden
echo "it's done!"

但更糟糕的是,我不得不去任务经理杀死隐藏的窗口而不知道它是否已经完成。

是否有一个比-NoNewWindow更好的参数可以强制不显示新窗口?

谢谢,

2 个答案:

答案 0 :(得分:3)

这是我用来自动杀死iTunes的内容。但是,正如我的评论中所提到的,如果您想等待它完成,您必须添加sleep或执行某些特定于应用程序的检查以查看其工作已完成。检查的内容取决于exe正在做什么。

$itunesProc = Get-Process -name iTunes -ErrorAction "Ignore"
if ($itunesProc -ne $null) {
   echo "Stopping iTunes..."
   Stop-Process -Name iTunes
} else {
   echo "No running iTunes process found"
}

答案 1 :(得分:3)

以下脚本将:

  1. 打开记事本。
  2. 等待您输入“已完成”。
  3. 关闭记事本。
  4. 您需要安装AutoIt。 (我在安装程序BTW中选择了“x86”。)

    您还需要调整Get-AU3ControlHandle电话以满足您的需求。 AutoIt窗口信息工具在那里很有用。您可能需要阅读AutoIt文档。

    另见AutoIt Cmdlets for Windows PowerShell

    import-module "${env:ProgramFiles(x86)}\AutoIt3\AutoItX\AutoItX.psd1"
    $p = Start-Process notepad -PassThru
    
    # Wait for the window to open
    while($p.MainWindowHandle -eq 0)
    {
        Start-Sleep 1
    }
    
    $c = Get-AU3ControlHandle -WinHandle $p.MainWindowHandle -Control "Edit1"
    
    while($true)
    {
        $t = Get-AU3ControlText $p.MainWindowHandle $c
    
        if ($p.HasExited)
        {
            break;
        }
        elseif ($t -eq "Finished")
        {
            $p.CloseMainWindow();
            break;
        }
        else
        {
            Write-Output "Waiting 1 sec."
            Start-Sleep 1
        }
    }
    
    Write-Output "Done"