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