PowerShell
Trabajos de fondo de PowerShell
Buscar..
Introducción
Los trabajos se introdujeron en PowerShell 2.0 y ayudaron a resolver un problema inherente en las herramientas de línea de comandos. En pocas palabras, si inicia una tarea de ejecución prolongada, su indicador no estará disponible hasta que la tarea finalice. Como ejemplo de una tarea de larga ejecución, piense en este simple comando de PowerShell:
Get-ChildItem -Path c: \ -Recurse
Tomará un tiempo recuperar la lista completa de directorios de su unidad C :. Si lo ejecuta como trabajo, la consola recuperará el control y podrá capturar el resultado más adelante.
Observaciones
PowerShell Jobs se ejecuta en un nuevo proceso. Esto tiene pros y contras que están relacionados.
Pros:
- El trabajo se ejecuta en un proceso limpio, incluido el entorno.
- El trabajo puede ejecutarse de forma asíncrona a su proceso principal de PowerShell
Contras:
- Los cambios en el entorno del proceso no estarán presentes en el trabajo.
- Los parámetros que pasan y los resultados devueltos se serializan.
- Esto significa que si cambia un objeto de parámetro mientras el trabajo se está ejecutando, no se reflejará en el trabajo.
- Esto también significa que si un objeto no puede ser serializado, no puede pasarlo o devolverlo (aunque PowerShell puede copiar cualquier parámetro y pasar / devolver un PSObject).
Creación de empleo básico
Iniciar un bloque de script como trabajo de fondo:
$job = Start-Job -ScriptBlock {Get-Process}
Iniciar una secuencia de comandos como trabajo de fondo:
$job = Start-Job -FilePath "C:\YourFolder\Script.ps1"
Comience un trabajo utilizando Invoke-Command
en una máquina remota:
$job = Invoke-Command -ComputerName "ComputerName" -ScriptBlock {Get-Service winrm} -JobName "WinRM" -ThrottleLimit 16 -AsJob
Iniciar trabajo como un usuario diferente (Solicita contraseña):
Start-Job -ScriptBlock {Get-Process} -Credential "Domain\Username"
O
Start-Job -ScriptBlock {Get-Process} -Credential (Get-Credential)
Iniciar trabajo como un usuario diferente (No se solicita):
$username = "Domain\Username"
$password = "password"
$secPassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential -ArgumentList @($username, $secPassword)
Start-Job -ScriptBlock {Get-Process} -Credential $credentials
Gestión de trabajos básicos
Obtenga una lista de todos los trabajos en la sesión actual:
Get-Job
Esperando un trabajo para terminar antes de obtener el resultado:
$job | Wait-job | Receive-Job
Tiempo de espera de un trabajo si se ejecuta demasiado tiempo (10 segundos en este ejemplo)
$job | Wait-job -Timeout 10
Detener un trabajo (completa todas las tareas que están pendientes en esa cola de trabajos antes de finalizar):
$job | Stop-Job
Eliminar trabajo de la lista de trabajos en segundo plano de la sesión actual:
$job | Remove-Job
Nota : lo siguiente solo funcionará en trabajos de Workflow
trabajo.
Suspender un Workflow
trabajo (pausa):
$job | Suspend-Job
Reanudar un Workflow
trabajo:
$job | Resume-Job