Как я могу запустить процесс из powershell, не выводя его на передний план?

#powershell

Вопрос:

Я работаю над простым сценарием очистки для работы, который должен включать gpupdate. Что я хочу сделать, так это запустить gpupdate и захватить выходные данные или запустить их в другом окне и сохранить текущее окно сверху. Я пробовал несколько разных способов запуска gpupdate.exe (включая использование WSH с различными параметрами фокусировки), но он всегда появляется перед текущим окном PowerShell. PS командлет Invoke-GPUpdate выдает ошибку «Доступ запрещен», поэтому это не кажется подходящим решением. В настоящее время я пытаюсь вызвать API ProcessGPUpdate, но, должно быть, что-то не так с моим кодом. Мне все равно не очень нравится это решение, так как не похоже, что оно даст обратную связь/прогресс.

Справочный API: https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wmi_v2/class-library/remotegpupdate-processgpupdate-method-string-boolean-boolean-boolean-boolean-uint32-string-microsoft-grouppolicy

Мой текущий нерабочий код

 Add-Type '@
using Microsoft.GroupPolicy;
public static void ProcessGPUpdate(
string Computer,
bool force,
bool boot,
bool logoff,
bool sync,
uint delayInMinutes,
string target
)
'@
 

Я открыт для предложений о том, как этого добиться. В настоящее время я рассматриваю возможность минимизации gpupdate.

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

 

PS H:> $gpupdate = Start-Job -ScriptBlock { gpupdate.exe 2>$1 }
PS H:> get-job

Id     Name            PSJobTypeName   State         HasMoreData
Location             Command
--     ----            -------------   -----         -----------
--------             -------
1      Job1            BackgroundJob   Failed        False
localhost             gpupdate.exe 2>$1


PS H:> Receive-Job -Name Job1
[localhost] The background process reported an error with the following
message: .
      CategoryInfo          : OpenError: (localhost:String) [],
PSRemotingTransportException
      FullyQualifiedErrorId : 2100,PSSessionStateBroken
PS H:> $gpupdate = Start-Job -ScriptBlock { gpupdate.exe 2>$1 } -Name
gpupdate
PS H:> Receive-Job -Name gpupdate
[localhost] The background process reported an error with the following
message: .
      CategoryInfo          : OpenError: (localhost:String) [],
PSRemotingTransportException
      FullyQualifiedErrorId : 2100,PSSessionStateBroken
PS H:> $gpupdate = Start-Job -ScriptBlock { amp; "gpupdate.exe 2>$1" } -Name
gpupdate
PS H:> Receive-Job -Name gpupdate
[localhost] The background process reported an error with the following
message: .
      CategoryInfo          : OpenError: (localhost:String) [],
PSRemotingTransportException
      FullyQualifiedErrorId : 2100,PSSessionStateBroken
[localhost] The background process reported an error with the following
message: .
      CategoryInfo          : OpenError: (localhost:String) [],
PSRemotingTransportException
      FullyQualifiedErrorId : 2100,PSSessionStateBroken
PS H:> get-job

Id     Name            PSJobTypeName   State         HasMoreData
Location             Command
--     ----            -------------   -----         -----------
--------             -------
1      Job1            BackgroundJob   Failed        False
localhost             gpupdate.exe 2>$1
3      gpupdate        BackgroundJob   Failed        False
localhost             gpupdate.exe 2>$1
5      gpupdate        BackgroundJob   Failed        False
localhost             amp; "gpupdate.exe 2>$1"
 

Комментарии:

1. Если вы хотите незаметно запускать консольное приложение, сохраняя при этом возможность захвата его выходных данных, рассмотрите возможность использования Start-Job или, предпочтительно, если это возможно, Start-ThreadJob .

2. Я не пробовал Start-ThreadJob, но я пробовал Запускать задание несколькими способами, а также вызывать-команду-AsJob, и он всегда показывает статус «не удалось» без каких-либо других выходных данных/ошибок

3. Так что это не похоже на запуск-ThreadJob доступен на наших компьютерах >:-[

4. Когда вы используете Start-Job, не используйте cmd /c , просто $job = Start-job -ScriptBlock { gpupdate.exe 2>amp;1 } -Name gpupdate 2>amp;1-перенаправить все, что находится в потоке ошибок, в поток успеха, чтобы вы могли восстановить его также из задания. Как только задание завершится ( $job.State -eq 'Completed' ), вы можете получить результат, подобный $job.ChildJobs.output или $job | Receive-Job

5. Вы подключены к другому компьютеру в сеансе PSS, когда получаете эти ошибки? Похоже, что-то не так с powershell на компьютере, который вы используете. Можете ли вы попробовать то же самое с другого компьютера?