wake-up-neo.com

Ausführen von PowerShell von .NET Core aus

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/

17
JanivZ

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.

6
svick

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());
            }
        }
    }
}
11
James Eby

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 :

PowerShell unterstützt jetzt offiziell MacOS und Linux, einschließlich:

  • Windows 7, 8.1 und 10 
  • Windows Server 2008 R2, 2012 R2, 2016 
  • Windows Server halbjährlicher Channel
  • Ubuntu 14.04, 16.04 und 17.04 
  • Debian 8.7+ und 9 
  • CentOS 7 
  • Red Hat Enterprise Linux 7 
  • OpenSUSE 42.2 
  • Fedora 25, 26 
  • macOS 10.12 und höher

Protokollierung

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.

SSH-basiertes PowerShell-Remoting

Das PowerShell-Remoting-Protokoll (PSRP) arbeitet jetzt zusätzlich zum herkömmlichen WinRM-basierten PSRP mit dem Secure Shell-Protokoll (SSH). Quelle

Änderungen brechen link

1
Roman

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.

Siehe: https://stackoverflow.com/a/30846513/6116637

0
lindexi