2009-11-26 2 views
76

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

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

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

+0

Checkout этот вопрос, если вы заинтересованы в обучении: http://stackoverflow.com/questions/573623/powershell -vs-unix-shells –

ответ

82

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

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

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

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

+1

Хороший совет. Мне тоже нужно это для запланированной задачи :) –

+7

Для тех, кто подходит и пытается это сделать, вам нужно PowerShell v2 получить параметр -WindowStyle. –

+3

Я скомпилировал PsRun, однако, если я добавлю его в запланированную задачу, он также замигает окно ... – Ciantic

16

Вы можете использовать PowerShell Community Extensions и сделать это:

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/

(Via this forum thread.)

4

У меня возникла эта проблема при работе с 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 
}; 
9

Вот такой подход, который не требует командной строки 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) 
2

Вот один вкладыш:

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

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

1

Я думаю, что лучший способ скрыть экран консоли PowerShell, когда вы используете фоновый скрипт, - this codeBluecakes» ответ).

Я добавляю этот код в начало всех моих сценариев 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" in his answer in this post.