Existe-t-il un moyen d'exécuter des scripts PowerShell à partir de .net-core?
J'essaie d'exécuter un script PowerShell dans un nouveau 'site Web\api' . Core .net. Pour pouvoir utiliser PowerShell sur .net, nous devons ajouter le
Espace de noms System.Management.Automation.
Ce n’est pas possible pour le noyau .net (ou je n’ai pas trouvé le moyen approprié de l’ajouter) . Il existe quelques paquets NuGet qui visent également à ajouter ce DLL au projet, mais ne sont pas compatibles avec .net core non plus . Y a-t-il un moyen de le faire sur .net core? Voici quelques liens que j'ai essayés mais aucun d'entre eux n'est spécifique au noyau .net:
http://www.powershellmagazine.com/2014/03/18/writing-a-powershell-module-in-c-part-1-the-basics/
Référencement de system.management.automation.dll dans Visual Studio
https://www.nuget.org/packages/System.Management.Automation/
La réponse officielle est que l'exécution de PowerShell Core à partir de votre propre application n'est actuellement pas prise en charge. Le problème le plus important est probablement que .Net Core manque AppDomain.GetAssemblies()
, ce qui pourrait être corrigé dans .Net Core 1.2.
On dirait qu’il est bien pris en charge à partir de .NET Core 2.0 et PowerShell 6 Beta 3 (bien qu’il ait été pris en charge dans les versions bêta 1 et 2 également mais pas aussi facilement), voici un lien vers la documentation Host PowerShell dans le dépôt GitHub
Et ils donnent un bon exemple d'application montrant qu'ils fonctionnent avec .NET Core 2.0 et PowerShell Core v6.0.0-beta.3 et versions ultérieures:
https://github.com/PowerShell/PowerShell/tree/master/docs/Host-powershell
Afin d’obtenir les bons paquets dans ma liste de paquets NuGet, j’avais besoin d’ajouter powershell-core en tant que nouvel emplacement de référentiel NuGet qui était:
https://powershell.myget.org/F/powershell-core/api/v3/index.json
Je pourrais alors installer les packages 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
Ces trois dépendances étaient obligatoires et je pouvais ensuite exécuter la commande PowerShell simple suivante dans mon application Web MVC asp.net principale:
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());
}
}
}
}
Bien que la réponse de James Eby soit correcte, il y a eu quelques nouvelles informations que j'ai trouvées utiles.
Il existe maintenant PowerShell Core disponible pour une utilisation multiplate-forme. Et c'est open source!
Voici quelques points utiles de l'article de Microsoft :
Sous macOS, PowerShell utilise les API natives os_log pour se connecter au système de journalisation unifiée d'Apple. Sous Linux, PowerShell utilise Syslog, une solution de journalisation omniprésente.
Le protocole PSRP (PowerShell Remoting Protocol) fonctionne désormais avec le protocole SSH (Secure Shell) en plus du PSRP traditionnel basé sur WinRM. La source
Merci pour @Roman et @JamesEby.
Si nous ne pouvons pas utiliser dotnet core 2.0 ou version ultérieure et que nous pouvons utiliser Process
pour exécuter PowerShell.exe dans Windows.
Le chemin est C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
et nous pouvons utiliser Process
dans ce code.
var process = new Process
{
StartInfo = new ProcessStartInfo(@"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe",
script)
{
WorkingDirectory = Environment.CurrentDirectory,
RedirectStandardOutput = true,
CreateNoWindow = true,
}
};
process.Start();
var reader = process.StandardOutput;
return reader.ReadToEnd();
La valeur de script est le script PowerShell et la fonction reader.ReadToEnd()
renvoie le texte de sortie de Power Shell.