![Pregunta principal](https://rvso.com/image/1558694/Pregunta%20principal.png)
Estoy luchando con algo que debería ser obviamente simple pero que no parece tan sencillo de resolver. Tengo una secuencia dinámica de comandos de PowerShell para ejecutar. Es parte de algunas plantillas que escribí para mí para facilitar mi flujo de trabajo.
Aquí hay un ejemplo simple de comandos agrupados generados:
$commands = {
Write-Output "Navigating to tools->deploy";
Set-Location "C:\tools\deploy\";
Write-Output "OK. Run dd.ps1 [server name] to deploy.";
}
Es posible ejecutar esto $commands
usando Invoke-Command
. Finalmente tengo esta función que lo maneja:
function invokeNow() {
param([string]$c)
Invoke-Command $c;
}
Esto funciona bien. Ejecuta los comandos en el objeto en la ventana. Pero con el tiempo, le he añadido más funciones. Para cada nueva instrucción, tengo que abrir PowerShell cada vez... Esto se debe a que a veces, cuando se ejecuta un script, no puedo ejecutar otra función. Entonces, mi objetivo ahora es ejecutar el grupo de comandos anterior en unnuevoventana para poder usar una misma ventana de shell para invocar múltiples tareas (que se ejecutan en sus propias ventanas). Pensé que sería simple, así que modifiqué la función para
function invokeNow() {
param([string]$c)
Invoke-Expression "cmd /c start powershell -Command {$c} -NoProfile -NoExit";
}
Eso lleva a este resultado:
#< CLIXML
#< CLIXML
PS C:\tools\deploy\>
La navegación funcionó. Sin embargo, mi información de salida se pierde. Algunos comandos tienen instrucciones agregadas como deploy S1 foo
o deploy FS -src "data"
. A veces son difíciles de memorizar. Para eso tengo dos pequeñas preguntas: (1) ¿Dónde están mis Write-Output
datos? Y (2) ¿qué es esa CLIXML
cosa rara (parece XML de PowerShell "especial" según Google)? Cuando pido exit
cerrar esa ventana, veo un montón de cosas XML antes de que se cierre la ventana.
Pregunta principal
¿Es posible abrir una nueva ventana de PowerShell?entonces¿Ejecutar los comandos en mi $commands
objeto correctamente (incluyendo así los Write-Output
datos)?
Ya intenté agregar Invoke-Command
a lo anterior como
Invoke-Expression "cmd /c start powershell -Command {Invoke-Command -ScriptBlock $c} -NoProfile -NoExit";
pero la nueva ventana escupe muchas cosas XML...
Información de la versión
PS C:\> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.16299.251
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.16299.251
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1