В некоторых случаях вам может понадобится запуск сценария PowerShell в скрытом режиме, т.е. без появляющегося окна консоли. Такая необходимость может возникнуть, например, при периодическом запуске скрипта PoS через планировщик заданий, когда мелькающее черное окошко может отвлекать от работы или игры. Кроме того, многие системные администраторы предпочитают запускать сценарии PowerShell в скрытом режиме (без окна), чтобы не смущать неопытных пользователей, которых может напугать неожиданно появившееся черное окно консоли PowerShell.
Существует несколько способов спрятать окно PowerShell, однако все они не гарантируют того, что всплывающее окно консоли не появится хотя бы на доли секунды. Так что, лучше всего попеременно опробовать все три нижеприведенных решения, чтобы определить, какое именно из них является наиболее удобным для вас.
Создайте vbs-скрипт и добавьте в него следующий код, заменив адрес сценария PowerShell на свой:
command = "powershell.exe -nologo -noninteractive -command С:\Temp\my-script.ps1"
set shell = CreateObject("WScript.Shell")
shell.Run command,0, false
Цифра 0 означает запуск в скрытом виде, false — отсутствие ожидания окончания выполнения команды.
Теперь для запуска сценария PowerShell вы достаточно просто запустить этот vbs-файл, также его можно поместить в Планировщик задач. В любом случае окно консоли мелькать не будет.
Можно просто добавить в расписание исполнение скрипта следующим образом:
powershell.exe "С:\Temp\my-script.ps1" -NoLogo -NonInteractive -WindowStyle Hidden
Однако чаще всего этот способ не позволяет скрыть скрипт PowerShell от пользователя и окно консоли все равно мелькает.
Убрать окно консоли PowerShell можно, используя Windows API, а именно функцию функцией ShowWindowAsynс. Для этого просто добавьте в начало скрипта следующий код:
$Signature = @"
[DllImport(«user32.dll»)]public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
"@
$ShowWindowAsync = Add-Type -MemberDefinition $Signature -Name «Win32ShowWindowAsync» -Namespace Win32Functions -PassThru
$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $pid).MainWindowHandle, 0)