我想从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更好的参数可以强制不显示新窗口?
谢谢,
答案 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)
以下脚本将:
您需要安装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"