从.NET Core运行PowerShell

Jan*_*ivZ 22 .net c# powershell .net-core asp.net-core

有没有办法从.net-core运行PowerShell脚本?

我正在尝试在新的.net核心'website\api'中运行PowerShell脚本.从我所知道的,为了在.net上运行PowerShell,我们需要添加

System.Management.Automation命名空间.

这对于.net核心是不可能的(或者我没有找到合适的方法来添加它).有几个NuGet包也旨在将这个DLL添加到项目中,但这些也与.net内核不兼容.有没有办法在.net核心上执行此操作?以下是我尝试过的一些链接,但没有一个是.net核心特定的:

http://www.powershellmagazine.com/2014/03/18/writing-a-powershell-module-in-c-part-1-the-basics/

在Visual Studio中引用system.management.automation.dll

https://www.nuget.org/packages/System.Management.Automation/

Jam*_*Eby 24

从.NET Core 2.0和PowerShell 6 Beta 3看起来它得到了很好的支持(尽管它在Beta 1和2中也得到了支持,但也不那么容易),这里是GitHub repo中Host PowerShell文档的链接

他们提供了一个很好的示例应用程序,显示它运行.NET Core 2.0和PowerShell Core v6.0.0-beta.3及更高版本:

https://github.com/PowerShell/PowerShell/tree/master/docs/host-powershell

为了将正确的包装到我的NuGet包列表中,我确实需要添加powershell-core作为新的NuGet存储库位置,它是:

https://powershell.myget.org/F/powershell-core/api/v3/index.json

然后我可以安装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
Run Code Online (Sandbox Code Playgroud)

所有这三个依赖项都是必需的,然后我可以在我的asp.net核心MVC Web应用程序中执行以下简单的PowerShell命令:

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());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,支持增加了!感谢您添加信息! (2认同)
  • 没问题,感谢svick指出我正确的方向,你问的问题. (2认同)

svi*_*ick 7

官方的答案是,目前不支持从您自己的应用程序运行PowerShell Core.可能最大的问题是缺少.Net Core AppDomain.GetAssemblies(),可能会在.Net Core 1.2中修复.

  • AppDomain.GetAssemblies() 在 .NET Core 2.0 中可用。我不知道这是否解决了这里提出的问题。https://docs.microsoft.com/en-gb/dotnet/api/system.appdomain.getassemblies?view=netcore-2.0 (2认同)

lin*_*exi 6

感谢@Roman 和@JamesEby。

如果我们不能使用dotnet core 2.0或更高版本,我们可以使用Process在Windows中运行PowerShell.exe。

该路径是,我们可以在这段代码中C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe使用。Process

        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();
Run Code Online (Sandbox Code Playgroud)

script 值是 PowerShell 脚本,reader.ReadToEnd()返回 power shell 输出文本。

请参阅:/sf/answers/2159255941/