Desde que o comando seja um executável ou um arquivo que tenha um executável associado, use Start-Process (disponível na v2):
Start-Process -NoNewWindow ping google.com
Você também pode adicionar isso como uma função no seu perfil:
function bg() {Start-Process -NoNewWindow @args}
e então a invocação se torna:
bg ping google.com
Na minha opinião, Start-Job é um exagero para o caso de uso simples de executar um processo em segundo plano:
- O Start-Job não tem acesso ao seu escopo existente (porque é executado em uma sessão separada). Você não pode executar "Iniciar tarefa {bloco de notas $ myfile}"
- Start-Job não preserva o diretório atual (porque é executado em uma sessão separada). Você não pode executar "Start-Job {bloco de notas myfile.txt}" onde myfile.txt está no diretório atual.
- A saída não é exibida automaticamente. Você precisa executar o Receive-Job com o ID do trabalho como parâmetro.
NOTA: Em relação ao seu exemplo inicial, "bg sleep 30" não funcionaria porque sleep é um comando do Powershell. Start-Process só funciona quando você realmente bifurca um processo.
Start-Job
será morto quando o shell PS sair. Em contraste, parece que algo iniciado comStart-Process
continuará sendo executado após a saída do shell do PS. Essa é uma grande diferença.Start-Process
, ele sobreviverá ao encerramento do shell, mas se você o iniciou a partir de uma janela do console, ele permanecerá vinculado a essa janela e o fechamento da janela encerrará o processo.Start-Process
e por isso este trabalho não vai:Start-Process {ping -n 1000 example.com > ping__example.com.txt }
. A mesma coisaStart-Job
funciona bem (embora você precise usar o caminho completo para o arquivo de saída).Parece que o bloco de script passado
Start-Job
não é executado com o mesmo diretório atual doStart-Job
comando, portanto, especifique o caminho completo, se necessário.Por exemplo:
fonte
Ainda não descobri como obter o stdout em tempo real, o start-job exige que você pesquise stdout com o get-job
update: não consegui iniciar o trabalho para fazer facilmente o que quero, que é basicamente o bash & operator. aqui está o meu melhor hack até agora
fonte
Start-Job { Write-Output 'Hello world' } | Receive-Job -Wait
No PowerShell Core 6.0, você pode gravar
&
no final do comando e será equivalente à execução do pipeline em segundo plano no diretório de trabalho atual .Não é equivalente
&
no bash, é apenas uma sintaxe melhor para o recurso atual de trabalhos do PowerShell . Ele retorna um objeto de trabalho para que você possa usar todos os outros comandos que usaria para trabalhos. Por exemploReceive-Job
:Se você deseja executar algumas instruções em segundo plano, pode combinar
&
o operador de chamada , o{ }
bloco de scripts e esse novo&
operador de segundo plano, como aqui:Aqui estão mais algumas informações das páginas de documentação:
do Novidades do PowerShell Core 6.0 :
from about_operators / Operador em segundo plano Ampersand & :
fonte
Receive-Job 3
, mas nada acontece.fg
por trazer trabalho para o primeiro plano .fg
no PowerShell :( Lembro-me de olhar para ele, mas não consegui encontrar nadaVocê pode usar os cmdlets de tarefa do PowerShell para atingir seus objetivos.
Existem 6 cmdlets relacionados ao trabalho disponíveis no PowerShell.
Se interessante, você pode baixar o exemplo Como criar um trabalho em segundo plano no PowerShell
fonte
Você pode fazer algo assim.
E se você quiser esperar por isso:
Versão bônus osx ou linux:
Exemplo de script pinger que eu tenho. Os argumentos são passados como uma matriz:
fonte
start
bifurcará o processo e retornará o controle ao chamador. Mais informações aquitl; dr
fonte
Usei a solução descrita aqui http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry com êxito no PowerShell v1.0. Definitivamente será mais fácil no PowerShell v2.0.
fonte