Solución:
Parece que tiene un buen soporte a partir de .NET Core 2.0 y PowerShell 6 Beta 3 (aunque también fue compatible con Beta 1 y 2, pero no tan fácilmente), aquí hay un enlace a la documentación de Host PowerShell en el repositorio de GitHub
Y ofrecen una buena aplicación de muestra que la muestra ejecutándose con .NET Core 2.0 y PowerShell Core v6.0.0-beta.3 y posteriores:
https://github.com/PowerShell/PowerShell/tree/master/docs/host-powershell
Para obtener los paquetes correctos en mi lista de paquetes NuGet, necesitaba agregar powershell-core como una nueva ubicación del repositorio de NuGet que era:
https://powershell.myget.org/F/powershell-core/api/v3/index.json
Luego podría instalar los paquetes NuGet:
install-package microsoft.powershell.sdk -version 6.0.0-rc
install-package microsoft.powershell.commands.diagnostics -version 6.0.0-rc
install-package microsoft.wsman.management -version 6.0.0-rc
Las tres de estas dependencias eran necesarias y luego pude ejecutar el siguiente comando simple de PowerShell en mi aplicación web MVC principal de asp.net:
public class PowerShellHelper
{
public void Execute(string command)
{
using (var ps = PowerShell.Create())
{
var results = ps.AddScript(command).Invoke();
foreach (var result in results)
{
Debug.Write(result.ToString());
}
}
}
}
La respuesta oficial es que actualmente no se admite la ejecución de PowerShell Core desde su propia aplicación. Probablemente el mayor problema es que falta .Net Core AppDomain.GetAssemblies()
, que podría estar corregido en .Net Core 1.2.
Gracias por @Roman y @JamesEby.
Si no podemos usar dotnet core 2.0 o posterior y podemos usar Process
para ejecutar PowerShell.exe en Windows.
El camino es C:WindowsSystem32WindowsPowerShellv1.0powershell.exe
y podemos usar Process
en este código.
var process = new Process
{
StartInfo = new ProcessStartInfo(@"C:WindowsSystem32WindowsPowerShellv1.0powershell.exe",
script)
{
WorkingDirectory = Environment.CurrentDirectory,
RedirectStandardOutput = true,
CreateNoWindow = true,
}
};
process.Start();
var reader = process.StandardOutput;
return reader.ReadToEnd();
El valor de la secuencia de comandos es la secuencia de comandos de PowerShell y la reader.ReadToEnd()
Devuelve el texto de salida de Power Shell.
Ver: https://stackoverflow.com/a/30846513/6116637