Вопрос

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

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

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

Это было полезно?

Решение

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

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/

(С помощью эта ветка форума.)

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

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

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

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

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

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

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

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

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

Я добавляю этот код в начало всех моих скриптов 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
  

Если этот ответ помог вам, проголосуйте за <> Quot;! Bluecakes <> Quot!; в своем ответе на этот пост.

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

https://github.com/Vittel/RunHiddenConsole

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top