Как запустить скрипт PowerShell без отображения окна?


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

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

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

7 91

7 ответов:

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

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

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

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

можно использовать Расширения Сообщества 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/

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

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

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

$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)

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

использование параметра "CreateNoWindow" предотвратило появление службы ISD, это предупреждение.

process.StartInfo = new ProcessStartInfo("powershell.exe",
    String.Format(@" -NoProfile -ExecutionPolicy unrestricted -encodedCommand ""{0}""",encodedCommand))
{
   WorkingDirectory = executablePath,
   UseShellExecute = false,
   CreateNoWindow = true
};

вот один-лайнер:

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

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

Я думаю, что лучший способ скрыть экран консоли 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" в своем ответе в этом посте.

У меня была такая же проблема. Я узнал, если вы идете в задание на Планировщик Задач под управлением powershell.exe скрипт, вы можете нажать " выполнить независимо от того, вошел ли пользователь в систему или нет " и это никогда не будет показывать окно powershell при выполнении задачи.