Siempre que el comando sea un ejecutable o un archivo que tenga un ejecutable asociado, use Start-Process (disponible desde v2):
Start-Process -NoNewWindow ping google.com
También puede agregar esto como una función en su perfil:
function bg() {Start-Process -NoNewWindow @args}
y luego la invocación se convierte en:
bg ping google.com
En mi opinión, Start-Job es una exageración para el caso de uso simple de ejecutar un proceso en segundo plano:
- Start-Job no tiene acceso a su alcance existente (porque se ejecuta en una sesión separada). No puede hacer "Start-Job {notepad $ myfile}"
- Start-Job no conserva el directorio actual (porque se ejecuta en una sesión separada). No puede hacer "Start-Job {notepad myfile.txt}" donde myfile.txt está en el directorio actual.
- La salida no se muestra automáticamente. Debe ejecutar Receive-Job con la ID del trabajo como parámetro.
NOTA: Con respecto a su ejemplo inicial, "bg sleep 30" no funcionaría porque sleep es un comando de Powershell. Start-Process solo funciona cuando realmente bifurcas un proceso.
Start-Job
lo que comenzó se eliminará cuando se cierre el shell PS. Por el contrario, parece que algo conStart-Process
lo que comenzó continuará ejecutándose después de que se cierre el shell PS. Esta es una gran diferencia.Start-Process
, sobrevivirá a la terminación del shell, pero si lo inició desde una ventana de consola, entonces permanecerá vinculado a esa ventana y cerrar la ventana terminará el proceso.Start-Process
y por lo tanto esto no funcionará:Start-Process {ping -n 1000 example.com > ping__example.com.txt }
. Lo mismoStart-Job
funciona bien (aunque debe usar la ruta completa al archivo de salida).Parece que el bloque de script pasado
Start-Job
no se ejecuta con el mismo directorio actual que elStart-Job
comando, así que asegúrese de especificar una ruta completa si es necesario.Por ejemplo:
fuente
Todavía no he descubierto cómo obtener stdout en tiempo real, start-job requiere que realice una encuesta stdout con get-job
actualización: no pude iniciar el trabajo para hacer fácilmente lo que quiero, que es básicamente bash & operator. aquí está mi mejor truco hasta ahora
fuente
Start-Job { Write-Output 'Hello world' } | Receive-Job -Wait
Desde PowerShell Core 6.0 puede escribir
&
al final del comando y será equivalente a ejecutar su canalización en segundo plano en el directorio de trabajo actual .No es equivalente a
&
en bash, es solo una sintaxis más agradable para la función actual de trabajos de PowerShell . Devuelve un objeto de trabajo para que pueda usar todos los demás comandos que usaría para los trabajos. Por ejemploReceive-Job
:Si desea ejecutar un par de declaraciones en segundo plano, puede combinar el
&
operador de llamada , el{ }
bloque de script y este nuevo&
operador de fondo como aquí:Aquí hay más información de las páginas de documentación:
de Novedades de PowerShell Core 6.0 :
de about_operators / Ampersand background operator & :
fuente
Receive-Job 3
, pero no pasa nada.fg
para llevar el trabajo al primer plano * .fg
en powershell :( Recuerdo haberlo buscado, pero no pude encontrar nadaPuede usar los cmdlets de trabajo de PowerShell para lograr sus objetivos.
Hay 6 cmdlets relacionados con el trabajo disponibles en PowerShell.
Si le interesa, puede descargar la muestra Cómo crear un trabajo en segundo plano en PowerShell
fuente
Puedes hacer algo como esto.
Y si quieres esperarlo:
Versión de bonificación osx o linux:
Ejemplo de script pinger que tengo. Los argumentos se pasan como una matriz:
fuente
start
bifurcará el proceso y devolverá el control a la persona que llama. Más información aquítl; dr
fuente
He utilizado la solución descrita aquí http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry con éxito en PowerShell v1.0. Definitivamente será más fácil en PowerShell v2.0.
fuente