Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
powershell如何关闭.exe进程_Powershell - Fatal编程技术网

powershell如何关闭.exe进程

powershell如何关闭.exe进程,powershell,Powershell,我想从powershell启动一个.exe文件并等待它完成,然后继续执行powershell中的下一行。但是,在.exe文件完成其作业后,窗口仍保留在那里,以便手动关闭。就像记事本一样。这是我得到的 start-process -FilePath notepad -Wait -NoNewWindow echo "it's done!" 我指定了-nonewindow,但它仍然带有一个窗口,powershell必须等待,直到我手动关闭它。我怎样才能自动关闭它?.exe文件是我无法控制的第三方应用

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

start-process -FilePath notepad -Wait -NoNewWindow
echo "it's done!"
我指定了-nonewindow,但它仍然带有一个窗口,powershell必须等待,直到我手动关闭它。我怎样才能自动关闭它?.exe文件是我无法控制的第三方应用程序

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

我也试过-隐藏窗口样式

start-process -FilePath notepad -Wait -WindowStyle hidden
echo "it's done!"
但更糟糕的是,我必须去任务管理器杀死隐藏的窗口,而不知道它是否已完成

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


谢谢,

这就是我用来自动杀死iTunes的东西。但是,正如我在评论中提到的,如果您想等待它完成,您必须添加一个
睡眠
,或者执行一些特定于应用程序的检查,以查看它的工作是否完成。检查的内容取决于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"
}
以下脚本将:

  • 打开记事本
  • 等待您键入“完成”
  • 关闭记事本
  • 您将需要安装。(顺便说一句,我在安装程序中选择了“x86”。)

    您还需要调整
    Get-AU3ControlHandle
    调用以满足您的需要。自动IT窗口信息工具在那里会很有用。您可能需要阅读一些AutoIt文档

    另见


    要做到这一点,您要么必须睡眠几秒钟,并假设exe已完成,要么需要exe发出一些信号,表明作业已完成。exe是否执行任何指示其任务已完成的操作?创建一个文件?exe应用程序启动一个脚本窗口,并向脚本窗口写入一系列行。最后,它将在脚本窗口中写入“Finished”。这就是我知道它已经完成的原因。但是当它完成后,脚本窗口将保持在那里并且不会自动关闭。exe/script窗口做什么?您可以从PS验证什么吗?exe将数据导入数据库,然后将日志写入脚本窗口powershell无法从中获取信息。exe是COM类型的东西。嗯,也许你可以在powershell中查询数据库,看看数据什么时候都在那里?您是否可以从脚本窗口访问输出?在文件中?或者通过更改exe调用的脚本?感谢您的回复。该exe可能有多个进程。其中一些不是由我的powershell启动的。如果我只是按名称获取,我无法识别哪个是由我的powershell生成的。我想你只需获取exe的名称,这将杀死其他所有东西。但我不确定。丹,我试过了,如果我在第一行输入Finish,它会起作用。如果我输入了几行,然后最后一行包含Finish,它就不会捕获它。脚本窗口已写入数千行,最后一行已完成。而且这不是关键的一击。有没有办法让我抓住它?Thanks@Shawn,变量$t包含控件中的所有文本。因此,您可以执行类似于
    $t.Contains(“Finished”)
    $t.EndsWith(“Finished”)
    $t-匹配“Finished”之类的操作,而不是
    $t-eq“Finished”
    。基本上,您必须理解我编写的代码,并根据您的需要进行调整,因为我不熟悉您的特定程序,所以我不知道细节。您需要(1)在
    Get-AU3ControlHandle
    调用中找到要查找的正确控件。(2) 从控件检索文本后,在其中查找“Finished”。@Shawn,最好将1秒轮询延迟(
    Start Sleep 1
    )增加到更大的值,否则脚本可能会不必要地占用太多CPU,因为它每次通过循环检索数千行文本。
    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"