Start-Job
Inicia un trabajo en segundo plano de PowerShell.
Sintaxis
Start-Job
[-Name <String>]
[-ScriptBlock] <ScriptBlock>
[-Credential <PSCredential>]
[-Authentication <AuthenticationMechanism>]
[[-InitializationScript] <ScriptBlock>]
[-WorkingDirectory <String>]
[-RunAs32]
[-PSVersion <Version>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Start-Job
[-DefinitionName] <String>
[[-DefinitionPath] <String>]
[[-Type] <String>]
[-WorkingDirectory <String>]
[<CommonParameters>]
Start-Job
[-Name <String>]
[-Credential <PSCredential>]
[-FilePath] <String>
[-Authentication <AuthenticationMechanism>]
[[-InitializationScript] <ScriptBlock>]
[-WorkingDirectory <String>]
[-RunAs32]
[-PSVersion <Version>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Start-Job
[-Name <String>]
[-Credential <PSCredential>]
-LiteralPath <String>
[-Authentication <AuthenticationMechanism>]
[[-InitializationScript] <ScriptBlock>]
[-WorkingDirectory <String>]
[-RunAs32]
[-PSVersion <Version>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Description
El cmdlet Start-Job
inicia un trabajo en segundo plano de PowerShell en el equipo local.
Un trabajo en segundo plano de PowerShell ejecuta un comando sin interactuar con la sesión actual. Cuando se inicia un trabajo en segundo plano, un objeto de trabajo devuelve inmediatamente, incluso si el trabajo tarda un tiempo prolongado en finalizar. Puede seguir trabajando en la sesión sin interrupción mientras se ejecuta el trabajo.
El objeto de trabajo contiene información útil sobre el trabajo, pero no contiene los resultados del trabajo.
Cuando finalice el trabajo, use el cmdlet Receive-Job
para obtener los resultados del trabajo. Para obtener más información sobre los trabajos en segundo plano, vea about_Jobs.
Para ejecutar un trabajo en segundo plano en un equipo remoto, use el parámetro AsJob que está disponible en muchos cmdlets o use el cmdlet Invoke-Command
para ejecutar un comando Start-Job
en el equipo remoto. Para obtener más información, vea about_Remote_Jobs.
A partir de PowerShell 3.0, Start-Job
puede iniciar instancias de tipos de trabajo personalizados, como trabajos programados. Para obtener información sobre cómo usar Start-Job
para iniciar trabajos con tipos personalizados, consulte los documentos de ayuda de la característica de tipo de trabajo.
A partir de PowerShell 6.0, puede iniciar trabajos mediante el operador en segundo plano (&
). La funcionalidad del operador en segundo plano es similar a Start-Job
. Ambos métodos para iniciar un trabajo crean un objeto de trabajo de PSRemotingJob. Para obtener más información sobre el uso de ampersand (&
), vea about_Operators.
PowerShell 7 introdujo el parámetro WorkingDirectory que especifica el directorio de trabajo inicial de un trabajo en segundo plano. Si no se especifica el parámetro , Start-Job
el valor predeterminado es el directorio de trabajo actual del autor de la llamada que inició el trabajo.
Nota
No se admite la creación de un trabajo en segundo plano fuera de proceso con Start-Job
en el escenario en el que PowerShell se hospeda en otras aplicaciones, como PowerShell Azure Functions.
Esto es por diseño, ya que Start-Job
depende del archivo ejecutable de pwsh
que esté disponible en $PSHOME
para iniciar un trabajo en segundo plano fuera del proceso, pero cuando una aplicación hospeda PowerShell, se usa directamente los paquetes del SDK de NuGet de PowerShell y no tendrá pwsh
enviado a lo largo.
El sustituto de ese escenario es Start-ThreadJob
del módulo ThreadJob.
Ejemplos
Ejemplo 1: Iniciar un trabajo en segundo plano
En este ejemplo se inicia un trabajo en segundo plano que se ejecuta en el equipo local.
Start-Job -ScriptBlock { Get-Process -Name pwsh }
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process -Name pwsh
Start-Job
usa el parámetro scriptBlock para ejecutar Get-Process
como trabajo en segundo plano. El parámetro Name especifica para buscar procesos de PowerShell, pwsh
. Se muestra la información del trabajo y PowerShell vuelve a un mensaje mientras el trabajo se ejecuta en segundo plano.
Para ver la salida del trabajo, use el cmdlet Receive-Job
. Por ejemplo, Receive-Job -Id 1
.
Ejemplo 2: Uso del operador en segundo plano para iniciar un trabajo en segundo plano
En este ejemplo se usa el operador en segundo plano (&
) para iniciar un trabajo en segundo plano en el equipo local. El trabajo obtiene el mismo resultado que Start-Job
en el ejemplo 1.
Get-Process -Name pwsh &
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
5 Job5 BackgroundJob Running True localhost Microsoft.PowerShell.Man...
Get-Process
usa el parámetro Name para especificar procesos de PowerShell, pwsh
. Ampersand (&
) ejecuta el comando como un trabajo en segundo plano. Se muestra la información del trabajo y PowerShell vuelve a un mensaje mientras el trabajo se ejecuta en segundo plano.
Para ver la salida del trabajo, use el cmdlet Receive-Job
. Por ejemplo, Receive-Job -Id 5
.
Ejemplo 3: Iniciar un trabajo mediante Invoke-Command
En este ejemplo se ejecuta un trabajo en varios equipos. El trabajo se almacena en una variable y se ejecuta mediante el nombre de la variable en la línea de comandos de PowerShell.
$jobWRM = Invoke-Command -ComputerName (Get-Content -Path C:\Servers.txt) -ScriptBlock {
Get-Service -Name WinRM } -JobName WinRM -ThrottleLimit 16 -AsJob
Se crea un trabajo que usa Invoke-Command
y se almacena en la variable $jobWRM
.
Invoke-Command
usa el parámetro ComputerName para especificar los equipos en los que se ejecuta el trabajo.
Get-Content
obtiene los nombres de servidor del archivo C:\Servers.txt
.
El parámetro scriptBlock especifica un comando que Get-Service
obtiene el servicio WinRM. El parámetro JobName especifica un nombre descriptivo para el trabajo, WinRM. El parámetro ThrottleLimit limita el número de comandos simultáneos a 16. El parámetro AsJob inicia un trabajo en segundo plano que ejecuta el comando en los servidores.
Ejemplo 4: Obtener información del trabajo
En este ejemplo se obtiene información sobre un trabajo y se muestran los resultados de un trabajo completado que se ejecutó en el equipo local.
$j = Start-Job -ScriptBlock { Get-WinEvent -Log System } -Credential Domain01\User01
$j | Select-Object -Property *
State : Completed
HasMoreData : True
StatusMessage :
Location : localhost
Command : Get-WinEvent -Log System
JobStateInfo : Completed
Finished : System.Threading.ManualResetEvent
InstanceId : 27ce3fd9-40ed-488a-99e5-679cd91b9dd3
Id : 18
Name : Job18
ChildJobs : {Job19}
PSBeginTime : 8/8/2019 14:41:57
PSEndTime : 8/8/2019 14:42:07
PSJobTypeName : BackgroundJob
Output : {}
Error : {}
Progress : {}
Verbose : {}
Debug : {}
Warning : {}
Information : {}
Start-Job
usa el parámetro ScriptBlock para ejecutar un comando que especifica Get-WinEvent
para obtener el registro de System. El parámetro Credential especifica una cuenta de usuario de dominio con permiso para ejecutar el trabajo en el equipo. El objeto de trabajo se almacena en la variable $j
.
El objeto de la variable $j
se envía a la canalización para Select-Object
. El parámetro Property especifica un asterisco (*
) para mostrar todas las propiedades del objeto de trabajo.
Ejemplo 5: Ejecución de un script como trabajo en segundo plano
En este ejemplo, se ejecuta un script en el equipo local como un trabajo en segundo plano.
Start-Job -FilePath C:\Scripts\Sample.ps1
Start-Job
usa el parámetro FilePath para especificar un archivo de script almacenado en el equipo local.
Ejemplo 6: Obtención de un proceso mediante un trabajo en segundo plano
En este ejemplo se usa un trabajo en segundo plano para obtener un proceso especificado por nombre.
Start-Job -Name PShellJob -ScriptBlock { Get-Process -Name PowerShell }
Start-Job
usa el parámetro Name para especificar un nombre de trabajo descriptivo, PShellJob. El parámetro scriptBlock de especifica Get-Process
para obtener procesos con el nombre PowerShell.
Ejemplo 7: Recopilar y guardar datos mediante un trabajo en segundo plano
En este ejemplo se inicia un trabajo que recopila una gran cantidad de datos de mapa y, a continuación, se guarda en un archivo .tif
.
Start-Job -Name GetMappingFiles -InitializationScript {Import-Module -Name MapFunctions} -ScriptBlock {
Get-Map -Name * | Set-Content -Path D:\Maps.tif }
Start-Job
usa el parámetro Name para especificar un nombre de trabajo descriptivo, GetMappingFiles. El parámetro initializationScript ejecuta un bloque de script que importa el módulo MapFunctions de. El parámetro ScriptBlock ejecuta Get-Map
y Set-Content
guarda los datos en la ubicación especificada por el parámetro path de.
Ejemplo 8: Pasar la entrada a un trabajo en segundo plano
En este ejemplo se usa el $input
variable automática para procesar un objeto de entrada. Use Receive-Job
para ver la salida del trabajo.
Start-Job -ScriptBlock { Get-Content -Path $input } -InputObject "C:\Servers.txt"
Receive-Job -Name Job45 -Keep
Server01
Server02
Server03
Server04
Start-Job
usa el parámetro ScriptBlock para ejecutar Get-Content
con la variable automática $input
. La variable $input
obtiene objetos del parámetro InputObject.
Receive-Job
usa el parámetro Name para especificar el trabajo y genera los resultados. El parámetro Keep guarda la salida del trabajo para que se pueda volver a ver durante la sesión de PowerShell.
Ejemplo 9: Establecimiento del directorio de trabajo para un trabajo en segundo plano
El WorkingDirectory permite especificar un directorio alternativo para un trabajo desde el que puede ejecutar scripts o abrir archivos. En este ejemplo, el trabajo en segundo plano especifica un directorio de trabajo diferente de la ubicación del directorio actual.
PS C:\Test> Start-Job -WorkingDirectory C:\Test\Scripts { $PWD } | Receive-Job -AutoRemoveJob -Wait
Path
----
C:\Test\Scripts
El directorio de trabajo actual de este ejemplo es C:\Test
.
Start-Job
usa el parámetro WorkingDirectory para especificar el directorio de trabajo del trabajo. El parámetro ScriptBlock usa $PWD
para mostrar el directorio de trabajo del trabajo.
Receive-Job
muestra la salida del trabajo en segundo plano.
AutoRemoveJob elimina el trabajo y Wait suprime el símbolo del sistema hasta que se reciban todos los resultados.
Ejemplo 10: Usar el parámetro ArgumentList para especificar una matriz
En este ejemplo se usa el parámetro ArgumentList para especificar una matriz de argumentos. La matriz es una lista separada por comas de nombres de proceso.
Start-Job -ScriptBlock { Get-Process -Name $args } -ArgumentList powershell, pwsh, notepad
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process -Name $args
El cmdlet Start-Job
usa el parámetro ScriptBlock para ejecutar un comando.
Get-Process
usa el parámetro Name para especificar la variable automática $args
. El parámetro ArgumentList pasa la matriz de nombres de proceso a $args
. Los nombres de proceso powershell, pwsh y el Bloc de notas son procesos que se ejecutan en el equipo local.
Para ver la salida del trabajo, use el cmdlet Receive-Job
. Por ejemplo, Receive-Job -Id 1
.
Ejemplo 11: Ejecución de un trabajo en Windows PowerShell 5.1
En este ejemplo se usa el parámetro PSVersion con el valor 5.1 para ejecutar el trabajo en una sesión de Windows PowerShell 5.1.
$PSVersionTable.PSVersion
Major Minor Patch PreReleaseLabel BuildLabel
----- ----- ----- --------------- ----------
7 0 0 rc.1
$job = Start-Job -ScriptBlock { $PSVersionTable.PSVersion } -PSVersion 5.1
Receive-Job -Job $job
Major Minor Build Revision
----- ----- ----- --------
5 1 14393 3383
Parámetros
-ArgumentList
Especifica una matriz de argumentos o valores de parámetro para el script especificado por el parámetro FilePath o un comando especificado con el parámetro ScriptBlock.
Los argumentos se deben pasar a ArgumentList como argumento de matriz de una sola dimensión. Por ejemplo, una lista separada por comas. Para obtener más información sobre el comportamiento de ArgumentList, vea about_Splatting.
Tipo: | Object[] |
Alias: | Args |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-Authentication
Especifica el mecanismo que se usa para autenticar las credenciales de usuario.
Los valores aceptables para este parámetro son los siguientes:
- Predeterminado
- Básico
- Credssp
- Resumen
- Kerberos
- Negociar
- NegotiateWithImplicitCredential
El valor predeterminado es Default.
La autenticación CredSSP solo está disponible en Windows Vista, Windows Server 2008 y versiones posteriores del sistema operativo Windows.
Para obtener más información sobre los valores de este parámetro, vea AuthenticationMechanism.
Cautela
La autenticación del proveedor de soporte técnico de seguridad de credenciales (CredSSP), en la que las credenciales del usuario se pasan a un equipo remoto para autenticarse, está diseñada para comandos que requieren autenticación en más de un recurso, como el acceso a un recurso compartido de red remoto. Este mecanismo aumenta el riesgo de seguridad de la operación remota. Si el equipo remoto está en peligro, se pueden usar las credenciales que se pasan a ella para controlar la sesión de red.
Tipo: | AuthenticationMechanism |
Valores aceptados: | Default, Basic, Negotiate, NegotiateWithImplicitCredential, Credssp, Digest, Kerberos |
Posición: | Named |
Valor predeterminado: | Default |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-Credential
Especifica una cuenta de usuario que tiene permiso para realizar esta acción. Si no se especifica el parámetro Credential, el comando usa las credenciales del usuario actual.
Escriba un nombre de usuario, como User01 o Domain01\User01, o escriba un objeto de PSCredential generado por el cmdlet Get-Credential
. Si escribe un nombre de usuario, se le pedirá que escriba la contraseña.
Las credenciales se almacenan en un objeto PSCredential y la contraseña se almacena como SecureString .
Nota
Para obtener más información sobre la protección de datos de SecureString, consulte ¿Qué tan segura es SecureString?.
Tipo: | PSCredential |
Posición: | Named |
Valor predeterminado: | Current user |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-DefinitionName
Especifica el nombre de definición del trabajo que inicia este cmdlet. Use este parámetro para iniciar tipos de trabajo personalizados que tengan un nombre de definición, como trabajos programados.
Cuando se usa Start-Job
para iniciar una instancia de un trabajo programado, el trabajo se inicia inmediatamente, independientemente de los desencadenadores de trabajo o las opciones de trabajo. La instancia de trabajo resultante es un trabajo programado, pero no se guarda en el disco como los trabajos programados desencadenados. No puede usar el parámetro ArgumentList de Start-Job
para proporcionar valores para los parámetros de los scripts que se ejecutan en un trabajo programado.
Este parámetro se introdujo en PowerShell 3.0.
Tipo: | String |
Posición: | 0 |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-DefinitionPath
Especifica la ruta de acceso de la definición del trabajo que se inicia este cmdlet. Escriba la ruta de acceso de definición. La concatenación de los valores de DefinitionPath y DefinitionName parámetros es la ruta de acceso completa de la definición del trabajo. Use este parámetro para iniciar tipos de trabajo personalizados que tengan una ruta de acceso de definición, como trabajos programados.
Para los trabajos programados, el valor del parámetro DefinitionPath es $HOME\AppData\Local\Windows\PowerShell\ScheduledJob
.
Este parámetro se introdujo en PowerShell 3.0.
Tipo: | String |
Posición: | 1 |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-FilePath
Especifica un script local que Start-Job
se ejecuta como un trabajo en segundo plano. Escriba la ruta de acceso y el nombre de archivo del script o use la canalización para enviar una ruta de acceso de script a Start-Job
. El script debe estar en el equipo local o en una carpeta a la que pueda acceder el equipo local.
Cuando se usa este parámetro, PowerShell convierte el contenido del archivo de script especificado en un bloque de script y ejecuta el bloque de script como un trabajo en segundo plano.
Tipo: | String |
Posición: | 0 |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-InitializationScript
Especifica los comandos que se ejecutan antes de que se inicie el trabajo. Para crear un bloque de script, incluya los comandos entre llaves ({}
).
Use este parámetro para preparar la sesión en la que se ejecuta el trabajo. Por ejemplo, puede usarlo para agregar funciones, complementos y módulos a la sesión.
Tipo: | ScriptBlock |
Posición: | 1 |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-InputObject
Especifica la entrada para el comando. Escriba una variable que contenga los objetos o escriba un comando o expresión que genere los objetos.
En el valor del parámetro ScriptBlock, use la variable automática $input
para representar los objetos de entrada.
Tipo: | PSObject |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | True |
Aceptar caracteres comodín: | False |
-LiteralPath
Especifica un script local que este cmdlet se ejecuta como un trabajo en segundo plano. Escriba la ruta de acceso de un script en el equipo local.
Start-Job
usa el valor del parámetro LiteralPath exactamente como se escribe. No se interpreta ningún carácter comodín. Si la ruta de acceso incluye caracteres de escape, escríbala entre comillas simples. Las comillas simples indican a PowerShell que no interprete ningún carácter como secuencias de escape.
Tipo: | String |
Alias: | PSPath, LP |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-Name
Especifica un nombre descriptivo para el nuevo trabajo. Puede usar el nombre para identificar el trabajo con otros cmdlets de trabajo, como el cmdlet Stop-Job
.
El nombre descriptivo predeterminado es Job#
, donde #
es un número ordinal que se incrementa para cada trabajo.
Tipo: | String |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | True |
Aceptar caracteres comodín: | False |
-PSVersion
Especifica una versión de PowerShell que se va a usar para ejecutar el trabajo. Cuando el valor de PSVersion es 5.1 El trabajo se ejecuta en una sesión de Windows PowerShell 5.1. Para cualquier otro valor, el trabajo se ejecuta con la versión actual de PowerShell.
Este parámetro se agregó en PowerShell 7 y solo funciona en Windows.
Tipo: | Version |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-RunAs32
A partir de PowerShell 7, el parámetro RunAs32 no funciona en PowerShell de 64 bits (pwsh
).
Si se especifica runAs32 en PowerShell de 64 bits, Start-Job
produce un error de excepción de terminación.
Para iniciar un proceso de PowerShell de 32 bits (pwsh
) con RunAs32, debe tener instalado PowerShell de 32 bits.
En PowerShell de 32 bits, RunAs32 obliga al trabajo a ejecutarse en un proceso de 32 bits, incluso en un sistema operativo de 64 bits.
En versiones de 64 bits de Windows 7 y Windows Server 2008 R2, cuando el comando Start-Job
incluye el parámetro RunAs32, no puede usar el parámetro Credential para especificar las credenciales de otro usuario.
Tipo: | SwitchParameter |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-ScriptBlock
Especifica los comandos que se van a ejecutar en el trabajo en segundo plano. Para crear un bloque de script, incluya los comandos entre llaves ({}
). Use la variable automática $input
para tener acceso al valor del parámetro InputObject de. Este parámetro es obligatorio.
Tipo: | ScriptBlock |
Alias: | Command |
Posición: | 0 |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-Type
Especifica el tipo personalizado para los trabajos iniciados por Start-Job
. Escriba un nombre de tipo de trabajo personalizado, como PSScheduledJob para trabajos programados o PSWorkflowJob para trabajos de flujos de trabajo. Este parámetro no es válido para los trabajos en segundo plano estándar.
Este parámetro se introdujo en PowerShell 3.0.
Tipo: | String |
Posición: | 2 |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-WorkingDirectory
Especifica el directorio de trabajo inicial del trabajo en segundo plano. Si no se especifica el parámetro , el trabajo se ejecuta desde la ubicación predeterminada. La ubicación predeterminada es el directorio de trabajo actual del autor de la llamada que inició el trabajo.
Este parámetro se introdujo en PowerShell 7.
Tipo: | String |
Posición: | Named |
Valor predeterminado: | $HOME on Unix (macOS, Linux) and $HOME\Documents on Windows |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
Entradas
Puede canalizar un objeto con la propiedad Name al parámetro name a este cmdlet. Por ejemplo, puede canalizar un objeto FileInfo desde Get-ChildItem
.
Salidas
System.Management.Automation.PSRemotingJob
Este cmdlet devuelve un objeto PSRemotingJob que representa el trabajo que inició.
Notas
PowerShell incluye los siguientes alias para Start-Job
:
- Todas las plataformas:
sajb
Para ejecutarse en segundo plano, Start-Job
se ejecuta en su propia sesión en la sesión actual. Cuando se usa el cmdlet Invoke-Command
para ejecutar un comando de Start-Job
en una sesión en un equipo remoto, Start-Job
se ejecuta en una sesión en la sesión remota.