web-dev-qa-db-ja.com

.NET CoreからPowerShellを実行する

.net-coreからPowerShellスクリプトを実行する方法はありますか?

新しい.netコア 'website\api'でPowerShellスクリプトを実行しようとしています。 PowerShellを.netで実行するために私が言えることから、

System.Management.Automation名前空間。

これは.netコアでは不可能です(または、追加する適切な方法が見つかりませんでした)。プロジェクトにこのDLLを追加することを目的としたNuGetパッケージがいくつかありますが、これらは.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/

20
JanivZ

公式の答え は、独自のアプリケーションからPowerShell Coreを実行することは現在サポートされていないということです。おそらく最大の問題は、.Net CoreにAppDomain.GetAssemblies()がないことです。これは.Net Core 1.2で修正される可能性があります。

7
svick

.NET Core 2.0およびPowerShell 6 Beta 3の時点で十分にサポートされているようですが(ベータ1および2でもサポートされていましたが、それほど簡単ではありません)、 GitHubのホスト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

これらの3つの依存関係がすべて必要だったため、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());
            }
        }
    }
}
20
James Eby

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
  • Red Hat Enterprise Linux 7
  • OpenSUSE 42.2
  • Fedora 25、26
  • macOS 10.12以降

ロギング

MacOSでは、PowerShellはネイティブのos_log APIを使用してAppleの統合ログシステムにログを記録します。 Linuxでは、PowerShellはユビキタスログソリューションであるSyslogを使用します。

SSHベースのPowerShell Remoting

PowerShell Remoting Protocol(PSRP)は、従来のWinRMベースのPSRPに加えて、Secure Shell(SSH)プロトコルと連携するようになりました。 ソース

重大な変更 リンク

1
Roman

@Romanおよび@JamesEbyのThx。

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://stackoverflow.com/a/30846513/6116637

0
lindexi