web-dev-qa-db-ja.com

.NET Coreを使用してPowerShellバイナリコマンドレットを作成できますか?

バイナリコマンドレット内部を使用して基本的なPowerShellモジュールを作成しようとしています。これは、PowerShellでの書き込みがC#ほど便利に見えないためです。

this ガイドに従うと、次のようになります。

  • Microsoft.PowerShell.SDK を私のproject.jsonに追加します
  • コマンドレットクラスに必要な属性をマークします
  • 私の.dllをターゲットにして、RootModuleを使用してマニフェストファイルを書き込みます
  • その.dllを近くの​​マニフェストに置く
  • 両方をPSModulePathの下に置きます

しかし、Import-Moduleを実行しようとすると、PowerShellコアがランタイムの欠落について文句を言います。

Import-Module : Could not load file or Assembly 'System.Runtime, Version=4.1.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system
cannot find the file specified.
At line:1 char:1 

私は何か間違ったことをしているのですか、それともそのようなトリッキーなことはまだサポートされていませんか?

15
brutallord

これは、.NET Core 2.0 SDKおよびVisual Studio 2017 Update 15.3(またはそれ以上)を使用するとはるかに簡単になります。 VSがない場合は、.NET Core 2.0SDKを使用してコマンドラインからこれを実行できます。

重要な点は、PowerShellStandard.Library 3.0.0-preview-01(またはそれ以上)のNuGetパッケージをプロジェクトファイル(.csproj)に追加することです。

簡単なコマンドラインの例を次に示します。

cd $home
dotnet new classlib --name psmodule
cd .\psmodule
dotnet add package PowerShellStandard.Library --version 3.0.0-preview-01
Remove-Item .\Class1.cs
@'
using System.Management.Automation;

namespace PSCmdletExample
{
    [Cmdlet("Get", "Foo")]
    public class GetFooCommand : PSCmdlet
    {
        [Parameter]
        public string Name { get; set; } = string.Empty;

        protected override void EndProcessing()
        {
            this.WriteObject("Foo is " + this.Name);
            base.EndProcessing();
        }
    }
}
'@ | Out-File GetFooCommand.cs -Encoding UTF8

dotnet build
cd .\bin\Debug\netstandard2.0\
ipmo .\psmodule.dll
get-foo

これと同じコマンドをWindowsPowerShell 5.1で実行するには、もう少し作業が必要です。コマンドが機能する前に、以下を実行する必要があります。

Add-Type -Path "C:\Program Files\dotnet\sdk\NuGetFallbackFolder\Microsoft.netcore.app\2.0.0\ref\netcoreapp2.0\netstandard.dll"
10
Keith Hill

.NETCoreでPowerShellCmdLetを作成するには、PowerShell Coreを使用する必要があります。

project.jsonの修正を含むガイドがここにあります: https://github.com/PowerShell/PowerShell/tree/master/docs/cmdlet-example

要約すると、project.jsonに次のものが必要です。

    "dependencies": {
        "Microsoft.PowerShell.5.ReferenceAssemblies": "1.0.0-*"
    },

    "frameworks": {
        "netstandard1.3": {
            "imports": [ "net40" ],
            "dependencies": {
                "Microsoft.NETCore": "5.0.1-*",
                "Microsoft.NETCore.Portable.Compatibility": "1.0.1-*"
            }
        }
    }
1
TravisEz13