Cómo ejecutar un ScriptBlock con SessionState correctamente dentro de un ICommandPredictor?
Hola, estoy intentando ejecutar un ScriptBlock
con un SessionState
específico dentro de un ICommandPredictor
, pero si el ScriptBlock
tiene un pipe, simplemente se cuelga para siempre (podría ser un bloqueo).
Tengo un proyecto que recrea el problema aquí.
Para recrear el problema:
1. Clona el repositorio
2. Ábrelo en Visual Studio 2021.
3. Establece un punto de interrupción en Predictor.cs
en la línea 23.
4. Inicia con la depuración.
5. Escribe un carácter en la terminal que se abre.
6. Visual Studio debería aparecer con el punto de interrupción activado.
7. Pulsa F10 (Paso).
8. Nunca llegarás a la línea 28 o 31, ya que estamos atascados.
Así que podría haber hecho algo mal en cómo ejecuto ScriptBlocks…
Pero el flujo es:
1. Cuando se inicia la Terminal, ejecuta Install-ScriptBlock.
1. Esto ejecuta un ScriptBlock
con una nueva sesión que a su vez ejecuta set-scriptblock, set-scriptblock
almacena el ScriptBlock
proporcionado y el nuevo SessionState
.
2. Crea un ICommandPredictor y regístrelo en el Subsistema.
2. Cuando escribes en la Terminal, se invoca el ICommandPredictor
, que a su vez intenta ejecutar el ScriptBlock
que se guardó con set-scriptblock
utilizando la misma sesión.
Espero que esto tenga sentido y sé que el flujo es algo confuso, pero no puedo eliminar ninguno de los pasos del flujo sin arruinar mi caso de uso…
Entonces, ¿hay alguna manera de cambiar esto para permitirme ejecutar un ScriptBlock
dentro de un ICommandPredictor
con un SessionState
que se creó al ejecutar un ScriptBlock
sin que se cuelgue?
En caso de que mi enlace se rompa, aquí está el código completo.
davy.ai
El problema parece ser causado por ejecutar un
ScriptBlock
con un pipe dentro de unICommandPredictor
con unSessionState
específico. El flujo del proyecto es algo complicado, pero eliminar cualquiera de los pasos rompería el caso de uso. El problema ocurre cuando elICommandPredictor
intenta ejecutar elScriptBlock
guardado con el mismoSessionState
.Para solucionar este problema, algunos enfoques posibles podrían ser:
ScriptBlock
sin unSessionState
específico dentro delICommandPredictor
. Esto puede no ser posible si elSessionState
es necesario para que el script se ejecute correctamente.Crear un nuevo
SessionState
para cada ejecución deScriptBlock
dentro delICommandPredictor
. Esta podría ser una solución, pero podría tener un alto costo si se ejecutan múltiplesScriptBlocks
con frecuencia.Investigar y resolver la causa raíz del problema de bloqueo. Este podría ser un tema complejo y que requiere tiempo para resolver, pero podría ser la mejor solución a largo plazo.
En general, la mejor solución depende de los requisitos y restricciones específicos del caso de uso.