Взяв мою реплику от ответа @stej выше, когда я нашел этот вопрос, потому что я пытался сделать то же самое, я расширил, чтобы произвести этот код, который вернет скрипт в фокус, независимо от того, запускается ли он в окне консоли ISE или через приглашение cmd (через командный файл).
#bring script back into focus
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Tricks {
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
}
"@
$parent = Get-Process -id ((gwmi win32_process -Filter "processid='$pid'").parentprocessid)
If ($parent.Name -eq "cmd") {# Being run by via cmd prompt (batch file)
$h = (Get-Process cmd).MainWindowHandle
[void] [Tricks]::SetForegroundWindow($h)
}
else{# being run in powershell ISE or console
$h = (Get-Process -id $pid).MainWindowHandle
[void] [Tricks]::SetForegroundWindow($h)
}
Или для более легкого повторного использования сохраните следующее в виде файла .psm1 в каталоге вашего модуля - начиная с PS v3 и далее, вам не нужно его импортировать, вызов функции в модуле в каталоге вашего модуля импортирует его ,
Чтобы импортировать вручную, Import-Module .\Getfocus.psm1
(при условии, что он находится на вашем текущем пути).
Function Get-Focus{
#bring script back into focus
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Tricks {
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
}
"@
$parent = Get-Process -id ((gwmi win32_process -Filter "processid='$pid'").parentprocessid)
If ($parent.Name -eq "cmd") {# Being run by via cmd prompt (batch file)
$h = (Get-Process cmd).MainWindowHandle
[void] [Tricks]::SetForegroundWindow($h)
}
else{# being run in powershell ISE or console
$h = (Get-Process -id $pid).MainWindowHandle
[void] [Tricks]::SetForegroundWindow($h)
}
}
Export-ModuleMember -Function Get-Focus