3

как мне выполнить фоновую задачу в Powershell?

$ ant >/dev/null &        #cygwin

Самое близкое, что я могу получить к этому в Powershell, это

ps2> start-job {ant |out-null; `a}   #powershell

но тогда я не получаю вывод в режиме реального времени, и при этом я не получаю звуковой сигнал. Я должен опросить его с помощью receive-job и получить звуковой сигнал, когда stdout будет опрошен.

1 ответ1

6

Надеюсь, вы находитесь на версии 2 Powershell. Если это так, то вот как фоновая обработка работы:

Start-Job {Get-Process}

Это запустит работу в фоновом режиме. Если вы хотите взаимодействовать с заданием, просто назначьте его переменной:

$foo = Start-Job {Get-Process}

Теперь, конечно, хитрость приходит с знанием, когда работа сделана. Я понимаю, что это цель звонка, который вы положили в свой оригинальный пример. К сожалению, Powershell держит трубку до тех пор, пока вы не попросите результаты работы. Чтобы получить результаты работы, используйте командлет Receive-Job:

Receive-Job $foo

Меня интересует способ оповещения о завершении фоновой работы, поэтому я буду продолжать искать решение этой проблемы.

Ох, и для получения дополнительной информации:

Get-Help about_jobs

Итак, вот как получить звуковой сигнал по завершении. Во-первых, прочитайте это Получить уведомление, когда фоновое задание выполнено (кстати, это отличный ресурсный сайт). Я взял информацию там и добавил эту функцию в свой профиль:

function Register-JobWait{
param(
        $Job
     )
Register-ObjectEvent $job StateChanged -Action {
[Console]::Beep(1000,500)
$eventSubscriber | Unregister-Event
$eventSubscriber.Action | Remove-Job
} | Out-Null

}

Я также добавил псевдоним в свой профиль:

set-alias rjw Register-JobWait

так что теперь, если я хочу что-то сделать в фоновом режиме, я делаю это:

$foo = Start-Job {1..10 | Get-Process}
rjw $foo

Я жду звукового сигнала тогда:

Receive-Job $foo

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .