从 .NET Core 运行 PowerShell

Posted

技术标签:

【中文标题】从 .NET Core 运行 PowerShell【英文标题】:Running PowerShell from .NET Core 【发布时间】:2017-01-01 16:29:29 【问题描述】:

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

我正在尝试在新的 .net 核心“网站\api”中运行 PowerShell 脚本。 据我所知,为了在 .net 上运行 PowerShell,我们需要添加

System.Management.Automation 命名空间。

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

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

Referencing system.management.automation.dll in Visual Studio

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

【问题讨论】:

hun,tek第一个链接是2014 第一个链接用于显示通过代码运行 shell 所需的代码(和命名空间)...... 我也不是 ;) ... 但是,我认为这不是 .NET 团队现在为 .NET Core 策划的命名空间。去 Github Repo 向 Powershell 团队询问。他们应该是策划这种集成的人。在此处提出问题,并提供有关您想要做什么的更具体细节:github.com/PowerShell/PowerShell The powershell-core MyGet feed 包含支持 .Net Core 的 System.Management.Automation 的 alpha 版本。这对你有用吗? @Thomas - 你也是 Thomas - 非常感谢 - 你们给了我很好的领导 【参考方案1】:

看起来它在 .NET Core 2.0 和 PowerShell 6 Beta 3 中得到了很好的支持(虽然它在 Beta 1 和 2 中也得到了支持,但并不那么容易),这里有一个指向 Host PowerShell documentation in the GitHub repo 的链接

他们提供了一个很好的示例应用程序,显示它在 .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 核心 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());
            
        
    

【讨论】:

是的,添加了支持!感谢您添加信息! 没问题,感谢 svick 为我指明了正确的方向以及您提出的问题。 我得到 System.IO.FileNotFoundException:无法加载文件或程序集 'Microsoft.Management.Infrastructure,Version=1.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35',但仅限于 prod,在 dev它运作良好......【参考方案2】:

The official answer 是当前不支持从您自己的应用程序运行 PowerShell Core。可能最大的问题是 .Net Core 缺少 AppDomain.GetAssemblies(),这可能会在 .Net Core 1.2 中得到修复。

【讨论】:

AppDomain.GetAssemblies() 在 .NET Core 2.0 中可用。我不知道这是否解决了这里提出的问题。 docs.microsoft.com/en-gb/dotnet/api/…【参考方案3】:

感谢@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() 返回 power shell 输出文本。

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

【讨论】:

【参考方案4】:

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

现在有PowerShell Core 可供跨平台使用。而且是开源的!

以下是来自Microsoft的文章中的一些有用点:

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 红帽企业 Linux 7 OpenSUSE 42.2 Fedora 25、26 macOS 10.12+

记录

在 macOS 上,PowerShell 使用本机 os_log API 登录到 Apple 的统一日志系统。在 Linux 上,PowerShell 使用 Syslog,这是一种无处不在的日志记录解决方案。

基于 SSH 的 PowerShell 远程处理

除了基于 WinRM 的传统 PSRP 之外,PowerShell 远程处理协议 (PSRP) 现在还可以与安全外壳 (SSH) 协议一起使用。 Source

重大更改link

【讨论】:

以上是关于从 .NET Core 运行 PowerShell的主要内容,如果未能解决你的问题,请参考以下文章

powershell EF6 .Net Core 2现有数据库

我可以使用 .NET Core 编写 PowerShell 二进制 cmdlet 吗?

powershell 管理.NET Core控制台应用程序的用户秘密

如何从 PowerShell 运行 SQL Server 查询?

powershell 从Tridion Sites Core Service获取所有应用程序ID

尝鲜.net core2.1 ——编写一个global tool