バイナリコマンドレット内部を使用して基本的なPowerShellモジュールを作成しようとしています。これは、PowerShellでの書き込みがC#ほど便利に見えないためです。
this ガイドに従うと、次のようになります。
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
私は何か間違ったことをしているのですか、それともそのようなトリッキーなことはまだサポートされていませんか?
これは、.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"
.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-*"
}
}
}