Как запустить скрипт PowerShell без отображения окна? - PullRequest
103 голосов
/ 26 ноября 2009

Как можно запустить сценарий PowerShell без отображения окна или какого-либо другого знака для пользователя?

Другими словами, сценарий должен работать тихо в фоновом режиме без каких-либо признаков для пользователя.

Дополнительный балл за ответ, в котором не используются сторонние компоненты:)

Ответы [ 8 ]

108 голосов
/ 26 ноября 2009

Вы можете запустить его так (но на какое-то время это показывает окна):

PowerShell.exe -windowstyle hidden { your script.. }

Или вы используете вспомогательный файл, который я создал, чтобы избежать окна PsRun.exe, которое делает именно это. Вы можете загрузить исходный и исполняемый файл Запускать запланированные задачи с графическим интерфейсом WinForm в PowerShell . Я использую его для запланированных задач.

Отредактировано: как отметил Марко, этот параметр -windowstyle доступен только для V2.

17 голосов
/ 26 ноября 2009

Вы можете использовать Расширения сообщества PowerShell и сделать это:

start-process PowerShell.exe -arg $pwd\foo.ps1 -WindowStyle Hidden

Вы также можете сделать это с VBScript: http://blog.sapien.com/index.php/2006/12/26/more-fun-with-scheduled-powershell/

(через эту ветку форума .)

13 голосов
/ 16 января 2015

Вот подход, который не требует аргументов командной строки или отдельного модуля запуска. Это не совсем невидимо, потому что окно появляется мгновенно при запуске. Но затем он быстро исчезает. Там, где все в порядке, это, я думаю, самый простой подход, если вы хотите запустить свой скрипт, дважды щелкнув в проводнике или с помощью ярлыка в меню «Пуск» (включая, конечно, подменю «Запуск»). И мне нравится, что это часть кода самого скрипта, а не что-то внешнее.

Поместите это в начало вашего скрипта:

$t = '[DllImport("user32.dll")] public static extern bool ShowWindow(int handle, int state);'
add-type -name win -member $t -namespace native
[native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0)
10 голосов
/ 31 мая 2018

У меня была такая же проблема. Я обнаружил, что если вы перейдете к Task в Task Scheduler , на котором выполняется сценарий powershell.exe , вы можете нажать « Run независимо от того, вошел в систему или нет", и это никогда не будет отображать окно powershell при запуске задачи.

5 голосов
/ 29 января 2014

У меня была эта проблема при запуске из c #, в Windows 7 служба «Обнаружение интерактивных служб» появлялась при запуске скрытого окна powershell в качестве учетной записи SYSTEM.

Использование параметра «CreateNoWindow» не позволяло службе ISD отображать предупреждение.

process.StartInfo = new ProcessStartInfo("powershell.exe",
    String.Format(@" -NoProfile -ExecutionPolicy unrestricted -encodedCommand ""{0}""",encodedCommand))
{
   WorkingDirectory = executablePath,
   UseShellExecute = false,
   CreateNoWindow = true
};
4 голосов
/ 26 сентября 2017

Я думаю, что лучший способ скрыть экран консоли PowerShell, когда вы выполняете фоновые сценарии, - этот код (ответ " Bluecakes ").

Я добавляю этот код в начало всех моих скриптов PowerShell, которые мне нужно запускать в фоновом режиме.

# .Net methods for hiding/showing the console in the background
Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();

[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'
function Hide-Console
{
    $consolePtr = [Console.Window]::GetConsoleWindow()
    #0 hide
    [Console.Window]::ShowWindow($consolePtr, 0)
}
Hide-Console

Если вам помог этот ответ, пожалуйста, проголосуйте за "Bluecakes" в ответе на этот пост.

4 голосов
/ 03 августа 2017

Вот одна строка:

mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close")

Хотя для этого возможно очень короткое мигание окна, это должно быть редким явлением.

1 голос
/ 17 ноября 2018

Я создал небольшой инструмент, передающий вызов любому консольному инструменту, через который вы хотите запустить без окон, до исходного файла:

https://github.com/Vittel/RunHiddenConsole

После компиляции просто переименуйте исполняемый файл в « w.exe» (добавьте «w») и поместите его рядом с исходным исполняемым файлом. Затем вы можете позвонить e.G. powershellw.exe с обычными параметрами, и оно не всплывает в окне.

Если у кого-то есть идея, как проверить, ожидает ли созданный процесс ввода, я с радостью включу ваше решение:)

...