2008-10-09 34 views

Respuesta

29

El son algunas respuestas a esta pregunta.

  1. No puede hacerlo fácilmente en la versión 1
  2. Versión 2 (ahora en comunidad de tecnología de previsualización 2) tiene esta característica, se llama un trabajo (antes PsJob). Obtenga más información al respecto here o here.
  3. En realidad puedes hacerlo the hard way en v1, no dudes en tenerlo pero nunca me he molestado.
+0

Estas soluciones parecen no funcionar con Windows 7. – Marcin

+4

@Marcin - esta respuesta fue de 2008. En Windows 7, powershell 2.0 es RTM y tiene el cmdlet "start-job" para trabajos en segundo plano. – x0n

+0

No en mi Windows 7 no es así. – Marcin

17
ps2> start-job {start-sleep 20} 

todavía no he encontrado la manera de conseguir la salida estándar en tiempo real, puesta en trabajo que requiere para sondear la salida estándar con get-trabajo

Actualización: No se pudo iniciar trabajo que hacer fácilmente lo que quiero que es básicamente el operador bash &. aquí está mi mejor truco hasta ahora

PS> notepad $profile #edit init script -- added these lines 
function beep { write-host `a } 
function ajp { start powershell {ant java-platform|out-null;beep} } #new window, stderr only, beep when done 
function acjp { start powershell {ant clean java-platform|out-null;beep} } 
PS> . $profile #re-load profile script 
PS> ajp 
+0

A partir de PowerShell v3.0 puede obtener stdout en tiempo real como este: 'Start-Job {Write-Output 'Hello world'} | Receive-Job -Wait' – JamesQMurphy

11

Parece que el bloque de script pasado a Start-Job no se ejecuta con el mismo directorio actual como el comando Start-Job, así que asegúrese de especificar ruta de acceso completa si es necesario.

Por ejemplo:

Start-Job { C:\absolute\path\to\command.exe --afileparameter C:\absolute\path\to\file.txt } 
+2

Entonces, por ejemplo, si necesito ejecutar Git Pull en la línea de comandos, ¿debo especificar la ruta completa a todo ...? Eso es realmente molesto – CMCDragonkai

+1

gracias, gran consejo, ha estado dando vueltas con un trabajo que no funcionaría, esta fue la razón por la cual. – Omni

76

Mientras el comando es un archivo ejecutable o un archivo que tiene un archivo ejecutable asociado, utilice Start-Proceso (disponible en 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:

  1. Start-Job no tiene acceso a su alcance actual (porque se ejecuta en una sesión separada). No puede hacer "Start-Job {notepad $ myfile}"
  2. 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.
  3. La salida no se muestra automáticamente.Necesita ejecutar Receive-Job con la ID del trabajo como parámetro.

NOTA: Respecto a su ejemplo inicial, "bg sleep 30" no funcionaría porque sleep es un comando de Powershell. Start-Process solo funciona cuando realmente bifurca un proceso.

+6

Me alegro de haber encontrado esta respuesta. Estaba buscando el equivalente de un mecanismo de bifurcación de Unix. Para mí, parece que algo que comenzó con 'Start-Job' se eliminará cuando salga el shell PS.Por el contrario, parece que algo que comenzó con 'Start-Process' continuará ejecutándose después de que salga el shell PS. Esta es una diferencia ** mayor **. – peterh

+0

Sí, si inicia un script usando 'Start-Process', sobrevivirá a la terminación del shell, pero si lo inició desde una ventana de consola, entonces permanece vinculado a esa ventana y al cerrar la ventana se terminará el proceso. – Guss

+0

Sin embargo, tenga en cuenta que no puede hacer la redirección de salida con 'Start-Process' y que esto NO funcionará:' ​​Start-Process {ping -n 1000 example.com> ping__example.com.txt} '. Lo mismo con 'Start-Job' funciona bien (aunque debe usar la ruta completa al archivo de salida). – Nux

5

Puede usar los cmdlets de trabajos PowerShell para lograr sus objetivos.

Hay 6 cmdlets relacionados con el trabajo disponibles en PowerShell.

  • Get-Job
    • Obtiene trabajos en segundo plano de Windows PowerShell que se están ejecutando en la sesión actual
  • Receive-Job
    • obtiene los resultados de los trabajos en segundo plano de Windows PowerShell en la sesión actual
  • Remove-Job
    • Elimina un trabajo de fondo de Windows PowerShell
  • Start-Job
    • iniciar un trabajo de fondo de Windows PowerShell
  • Stop-Job
    • paradas un trabajo de fondo de Windows PowerShell
  • Wait-Job
    • Suprime el símbolo del sistema hasta que uno o todos los trabajos en segundo plano de Windows PowerShell que se ejecutan en la sesión de que se completen

Si interesante de esto, se puede descargar la muestra How to create background job in PowerShell

+0

Buena respuesta, ya que se trata de Powershell 3+. ¿Cuál es la diferencia entre los cmdlets de trabajo y las respuestas anteriores? –

Cuestiones relacionadas