Running PowerShell from .NET Core

本文关键字:Core NET from PowerShell Running | 更新日期: 2023-09-27 18:03:59

是否有办法从。net-core运行PowerShell脚本?

我正试图在新的。net core 'website'api'中运行PowerShell脚本。据我所知为了在。net上运行PowerShell我们需要添加

System.Management。自动化名称空间。

这是不可能的。net核心(或者我还没有找到适当的方式来添加它)。有几个NuGet包也旨在将这个DLL添加到项目中,但它们也不兼容。net core。有没有办法做到这一点在。net核心?以下是我尝试过的一些链接,但没有一个是。net core特定的:

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/

Running PowerShell from .NET Core

看起来它在。net Core 2.0和PowerShell 6 Beta 3中得到了很好的支持(尽管它在Beta 1和Beta 2中也得到了支持,但并不那么容易),这里是GitHub repo中主机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

这三个依赖项都是必需的,然后我可以在我的asp.net core 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());
            }
        }
    }
}

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

感谢@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();

脚本值为PowerShell脚本,reader.ReadToEnd()返回PowerShell输出文本。

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

虽然James Eby的答案是正确的,但我发现了一些有用的新信息。

PowerShell Core现在可以跨平台使用了。而且它是开源的!

以下是微软文章中一些有用的观点:

PowerShell现在正式支持macOS和Linux,包括:

  • Windows 7、8.1和10
  • Windows Server 2008 R2, 2012 R2, 2016
  • Windows Server半年度通道
  • Ubuntu 14.04、16.04和17.04
  • Debian 8.7+和9
  • CentOS 7
  • Red Hat Enterprise Linux 7
  • OpenSUSE 42.2
  • Fedora 25,26
  • macOS 10.12 +

日志

在macOS上,PowerShell使用原生的os_log api来登录到苹果的统一日志系统。在Linux上,PowerShell使用Syslog,一种无处不在的日志解决方案。

基于ssh的PowerShell Remoting

除了传统的基于winrm的PSRP之外,PowerShell远程协议(PSRP)现在还可以与SSH协议一起工作。源

break Changes link