我尝试使用二进制Cmdlet内部创建基本PowerShell模块,因为在PowerShell中编写内容并不像在C#中那样方便。
按照this指南,看起来我必须:
project.json
RootModule
编写清单文件,定位到我的.dll
.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
我做错了什么,或者还不支持这些棘手的事情?
答案 0 :(得分:8)
使用.NET Core 2.0 SDK
和Visual Studio 2017 Update 15.3
(或更高版本)可以轻松实现这一目标。如果您没有VS,则可以使用.NET Core 2.0 SDK从命令行执行此操作。
重要的是将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
要在Windows PowerShell 5.1中运行此命令,需要更多工作。在命令运行之前,您必须执行以下命令:
Add-Type -Path "C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.netcore.app\2.0.0\ref\netcoreapp2.0\netstandard.dll"
答案 1 :(得分:1)
您需要使用PowerShell Core
在.NET Core中编写PowerShell CmdLet。
此处有一个指南,包括对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-*"
}
}
}
答案 2 :(得分:0)
对于netcore,有一个新的powershell模板可以安装和使用,然后可以修改c#代码。
$ dotnet new -i Microsoft.PowerShell.Standard.Module.Template
$ dotnet new psmodule
dotnet build
有关更多详细信息,请阅读doc