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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Поместите это в начало script:

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

Здесь однострочный:

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

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

Ответ 8

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

https://github.com/Vittel/RunHiddenConsole

После компиляции просто переименуйте исполняемый файл в "& lt; targetExecutableName & gt; w.exe" (добавьте "w") и поместите его рядом с исходным исполняемым файлом. Затем вы можете позвонить e.G. powershellw.exe с обычными параметрами, и он не появится во всплывающем окне.

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

Ответ 9

Здесь забавная демонстрация управления различными состояниями консоли, включая сворачивание и скрытие.

Add-Type -Name ConsoleUtils -Namespace WPIA -MemberDefinition @'
   [DllImport("Kernel32.dll")]
   public static extern IntPtr GetConsoleWindow();
   [DllImport("user32.dll")]
   public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'@

$ConsoleMode = @{
 HIDDEN = 0;
 NORMAL = 1;
 MINIMIZED = 2;
 MAXIMIZED = 3;
 SHOW = 5
 RESTORE = 9
 }

$hWnd = [WPIA.ConsoleUtils]::GetConsoleWindow()

$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.MAXIMIZED)
"maximized $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.NORMAL)
"normal $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.MINIMIZED)
"minimized $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.RESTORE)
"restore $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.HIDDEN)
"hidden $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.SHOW)
"show $a"