Gibt es eine Möglichkeit, PowerShell-Skripts von .net-core aus auszuführen?
Ich versuche, ein PowerShell-Skript in einer neuen .net-Core-Website "\ api" auszuführen. Von was ich sagen kann, um PowerShell auf .net auszuführen, müssen wir das hinzufügen
System.Management.Automation-Namespace.
Dies ist für .net Core nicht möglich (oder ich habe nicht die passende Methode zum Hinzufügen gefunden) .. Es gibt einige NuGet-Pakete, die auch das Hinzufügen dieser DLL zum Projekt aber nur das Ziel haben sind nicht kompatibel mit .net core . Gibt es eine Möglichkeit, dies auf .net core zu tun? Hier sind einige Links, die ich ausprobiert habe, aber keiner davon ist .net-spezifisch:
http://www.powershellmagazine.com/2014/03/18/writing-a-powershell-module-in-c-part-1-the-basics/
Verweisen auf system.management.automation.dll in Visual Studio
https://www.nuget.org/packages/System.Management.Automation/
Die offizielle Antwort ist, dass das Ausführen von PowerShell Core von Ihrer eigenen Anwendung derzeit nicht unterstützt wird. Das größte Problem ist wahrscheinlich, dass .Net Core AppDomain.GetAssemblies()
fehlt, was möglicherweise in .Net Core 1.2 behoben wurde.
Sieht aus, als wäre sie ab .NET Core 2.0 und PowerShell 6 Beta 3 gut unterstützt (obwohl sie auch in Beta 1 und 2 unterstützt wurde, aber nicht so einfach). Hier ist ein Link zur Host PowerShell-Dokumentation im GitHub-Repo)
Und sie zeigen eine gute Beispielanwendung, die zeigt, dass sie mit .NET Core 2.0 und PowerShell Core v6.0.0-beta.3 und höher ausgeführt wird:
https://github.com/PowerShell/PowerShell/tree/master/docs/Host-powershell
Um die richtigen Pakete in meine NuGet-Paketliste aufzunehmen, musste ich powershell-core als neuen Speicherort für das NuGet-Repository hinzufügen.
https://powershell.myget.org/F/powershell-core/api/v3/index.json
Ich könnte dann die NuGet-Pakete installieren:
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
Alle drei dieser Abhängigkeiten waren erforderlich und dann konnte ich den folgenden einfachen PowerShell-Befehl in meiner asp.net core MVC-Webanwendung ausführen:
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());
}
}
}
}
Obwohl die Antwort von James Eby korrekt ist, gab es einige neue Informationen, die ich für nützlich hielt.
Für den plattformübergreifenden Einsatz ist jetzt PowerShell Core verfügbar. Und es ist Open Source!
Hier einige nützliche Punkte aus dem Artikel aus Microsoft :
Unter macOS verwendet PowerShell die systemeigenen os_log-APIs, um sich beim einheitlichen Protokollierungssystem von Apple anzumelden. Unter Linux verwendet PowerShell Syslog, eine allgegenwärtige Protokollierungslösung.
Das PowerShell-Remoting-Protokoll (PSRP) arbeitet jetzt zusätzlich zum herkömmlichen WinRM-basierten PSRP mit dem Secure Shell-Protokoll (SSH). Quelle
Thx für @Roman und @JamesEby.
Wenn wir dotnet core 2.0 oder höher nicht verwenden können, können wir Process
verwenden, um die PowerShell.exe in Windows auszuführen.
Der Pfad ist C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
und wir können Process
in diesem Code verwenden.
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();
Der Skriptwert ist das PowerShell-Skript, und reader.ReadToEnd()
gibt den Power Shell-Ausgabetext zurück.