我可以用.net Core编写PowerShell二进制命令行吗?

本文关键字:二进制 命令行 PowerShell 编写 net Core 我可以 | 更新日期: 2023-09-27 18:11:49

我正在尝试创建一个基本的PowerShell模块与二进制Cmdlet内部,因为写东西在PowerShell只不像在c#中看起来那么方便。

按照本指南,看起来我必须:

  • 添加Microsoft.PowerShell.SDK到我的project.json
  • 用必需的属性标记我的cmdlet类
  • 写清单文件,与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 

是我做错了什么,还是这样棘手的事情还不支持?

我可以用.net Core编写PowerShell二进制命令行吗?

对于.NET Core 2.0 SDKVisual 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"

对于netcore,有一个新的powershell模板,你可以安装和使用,然后你可以修改c#代码。

  • 安装PowerShell标准模块模板

$ dotnet new -i Microsoft.PowerShell.Standard.Module.Template
  • 在新文件夹中创建新的模块项目
$ dotnet new psmodule
  • 构建模块
dotnet build

详情请参阅doc

您需要使用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-*"
            }
        }
    }