Uso de una colección PSData con BeginInvoke en Powershell

Estoy tratando de procesar la salida de una canalización dentro de mi secuencia de comandos de PowerShell. En este momento, la única forma en que veo el resultado es cuando emití el EndInvoke para la canalización, pero dado que algunas de mis llamadas pueden durar mucho tiempo y pueden tener muchos resultados, me gustaría poder mostrar el resultado a medida que se ejecuta el proceso.

Parece que podría hacer esto pasando parámetros de entrada y salida al BeginInvoke método, pero parece que no puedo obtener la sintaxis correcta. ¿Alguna sugerencia? Un ejemplo de lo que estoy intentando está a continuación:

$scriptBlock = {param([int]$pauseTime = 10); Write-Output "Test"; Start-Sleep -Seconds $pauseTime; Write-Output "Test 2"}

# Create objects and set stuff up
$initialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault()
$runspacepool = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspacePool(1, 4, $initialSessionState, $Host)
$runspacepool.Open()
$pipeline = [powershell]::Create().AddScript($scriptBlock).AddParameter("pauseTime", 30)
$pipeline.RunspacePool = $runspacepool

# These two lines are not correct
$inputStream = New-Object [System.Management.Automation]
$outputStream = New-Object [System.Management.Automation.PSDataCollection]

$async = $pipeline.BeginInvoke($inputStream, $outputStream)

# Do something with the $outputStream here???

$pipeline.EndInvoke($async)

# Clean-up code    
$pipeline.Dispose()
$async = $null
$pipeline = $null
if ($runspacepool -ne $null) {$runspacepool.Close()}

preguntado el 12 de junio de 12 a las 17:06

1 Respuestas

No tengo idea de lo que está tratando de lograr (a mí también me parece demasiado complicado con el simple propósito de procesar el resultado de un script), pero con esta pequeña modificación de su PowerShell Script al menos obtendrá un resultado:

` $scriptBlock = { param([int]$pauseTime = 1) Write-Output "Test 1" Start-Sleep -Seconds $pauseTime Write-Output "Test 2" } # Crear objetos y configurar cosas $initialSessionState = [System. Management.Automation.Runspaces.InitialSessionState]::CreateDefault() $runspacepool = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspacePool(1, 4, $initialSessionState, $Host) $runspacepool.Open() $pipeline = [powershell]::Create().AddScript($scriptBlock).AddParameter("pauseTime", 5) $pipeline.RunspacePool = $runspacepool $outputStream = New-Object -Typename System.Management.Automation.PSDataCollection[PSObject] $async = $canalización.BeginInvoke() 1..10 | Foreach { "Estoy esperando..."; Start-Sleep -Milisegundos 500 } $outputStream = $pipeline.EndInvoke($async) # Código de limpieza $pipeline.Dispose() $async = $null $pipeline = $null if ($runspacepool -ne $null) {$ runspacepool.Close()} $outputStream `

respondido 17 nov., 12:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.